這篇文章主要講解了springboot+jwt實(shí)現(xiàn)token登陸權(quán)限認(rèn)證的代碼解析,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供云浮企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站建設(shè)、做網(wǎng)站、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為云浮眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
一 前言
此篇文章的內(nèi)容也是學(xué)習(xí)不久,終于到周末有時(shí)間碼一篇文章分享知識(shí)追尋者的粉絲們,學(xué)完本篇文章,讀者將對(duì)token類(lèi)的登陸認(rèn)證流程有個(gè)全面的了解,可以動(dòng)態(tài)搭建自己的登陸認(rèn)證過(guò)程;對(duì)小項(xiàng)目而已是個(gè)輕量級(jí)的認(rèn)證機(jī)制,符合開(kāi)發(fā)需求;
二 jwt實(shí)現(xiàn)登陸認(rèn)證流程
三 相關(guān)介紹jwt
3.1jwt 組成
JWT的token由三段信息構(gòu)成的,將這三段信息文本用.連接一起就構(gòu)成了JWT字符串;
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODI4OTc4NDUsInVzZXJuYW1lIjoienN6eHoifQ.vyiExkFWCCmQA3PFYL0jJfIiYGWubngqB0WcgmtHOxg
3.2 jwt優(yōu)點(diǎn)
四 jwt用戶登陸發(fā)放token
4.1 pom.xml
項(xiàng)目構(gòu)件如下
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>
4.2jwt工具類(lèi)
jwt工具類(lèi)中有三個(gè)方法,分別是生成數(shù)字簽名用于用戶首次登陸時(shí)發(fā)送jwt給客戶端;其次是校驗(yàn)方法,用于攔截器攔截所有規(guī)則內(nèi)的url,每個(gè)請(qǐng)求都必須帶有服務(wù)器發(fā)送的jwt,經(jīng)過(guò)驗(yàn)證后才放行請(qǐng)求;最后一個(gè)獲得用戶名的方法用于查詢(xún)密鑰,在驗(yàn)證jwt時(shí)作為參數(shù)傳入;
/* * * @Author lsc * <p> JWT工具類(lèi) </p> * @Param * @Return */ public class JwtUtil { // Token過(guò)期時(shí)間30分鐘 public static final long EXPIRE_TIME = 30 * 60 * 1000; /* * * @Author lsc * <p> 校驗(yàn)token是否正確 </p> * @Param token * @Param username * @Param secret * @Return boolean */ public static boolean verify(String token, String username, String secret) { try { // 設(shè)置加密算法 Algorithm algorithm = Algorithm.HMAC256(secret); JWTVerifier verifier = JWT.require(algorithm) .withClaim("username", username) .build(); // 效驗(yàn)TOKEN DecodedJWT jwt = verifier.verify(token); return true; } catch (Exception exception) { return false; } } /* * * @Author lsc * <p>生成簽名,30min后過(guò)期 </p> * @Param [username, secret] * @Return java.lang.String */ public static String sign(String username, String secret) { Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); Algorithm algorithm = Algorithm.HMAC256(secret); // 附帶username信息 return JWT.create() .withClaim("username", username) .withExpiresAt(date) .sign(algorithm); } /* * * @Author lsc * <p> 獲得用戶名 </p> * @Param [request] * @Return java.lang.String */ public static String getUserNameByToken(HttpServletRequest request) { String token = request.getHeader("token"); DecodedJWT jwt = JWT.decode(token); return jwt.getClaim("username") .asString(); } }
4.3 用戶實(shí)體
實(shí)體中包含用戶名,和密碼,一切從簡(jiǎn);
/** * @Author lsc * <p> </p> */ @Data public class SysUser { private String username; private String password; }
4.4Controller
表現(xiàn)層代碼用戶用戶登陸認(rèn)證,認(rèn)證成功后發(fā)放token給客戶端;
/** * @Author lsc * <p> </p> */ @RestController public class SysUserController { @PostMapping(value = "/login") public Map<String, Object> login(@RequestBody SysUser sysUser){ Map<String, Object> map = new HashMap<>(); String username = sysUser.getUsername(); String password = sysUser.getPassword(); // 省略 賬號(hào)密碼驗(yàn)證 // 驗(yàn)證成功后發(fā)送token String token = JwtUtil.sign(username,password); if (token != null){ map.put("code", "200"); map.put("message","認(rèn)證成功"); map.put("token", token); return map; } map.put("code", "403"); map.put("message","認(rèn)證失敗"); return map; } }
4.5 測(cè)試
測(cè)試url http://localhost:8080/login
postman post請(qǐng)求測(cè)試參數(shù)如下
{ "username": "zszxz", "password": "zszxz" }
返回內(nèi)容如下
{ "code": "200", "message": "認(rèn)證成功", "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODI4OTc4NDUsInVzZXJuYW1lIjoienN6eHoifQ.vyiExkFWCCmQA3PFYL0jJfIiYGWubngqB0WcgmtHOxg" }
五 jwt登陸攔截認(rèn)證
基于前面已經(jīng)實(shí)現(xiàn)jwt登錄認(rèn)證后發(fā)放token給客戶端;本節(jié)內(nèi)容就是將token放入請(qǐng)求頭中發(fā)送請(qǐng)求給服務(wù)器;服務(wù)器使用攔截器攔截請(qǐng)求對(duì)token進(jìn)行驗(yàn)證;驗(yàn)證成功請(qǐng)求通過(guò),否則請(qǐng)求資源失?。?/p>
5.1自定義攔截器
自定義攔截器JwtInterceptor,實(shí)現(xiàn)HandlerInterceptor接口,每次請(qǐng)求到達(dá)之前都會(huì)驗(yàn)證token是否有效;
/** * @Author lsc * <p>token驗(yàn)證攔截器 </p> */ @Component public class JwtInterceptor implements HandlerInterceptor { @Autowired SysUserService sysUserService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 從 http 請(qǐng)求頭中取出 token String token = request.getHeader("token"); // 如果不是映射到方法直接通過(guò) if(!(handler instanceof HandlerMethod)){ return true; } if (token != null){ String username = JwtUtil.getUserNameByToken(request); // 這邊拿到的 用戶名 應(yīng)該去數(shù)據(jù)庫(kù)查詢(xún)獲得密碼,簡(jiǎn)略,步驟在service直接獲取密碼 boolean result = JwtUtil.verify(token,username,sysUserService.getPassword()); if(result){ System.out.println("通過(guò)攔截器"); return true; } } return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
5.2 service
/** * @Author lsc * <p> 模擬查詢(xún)數(shù)據(jù)庫(kù)獲得賬號(hào)密碼 </p> */ @Service public class SysUserService { public String getPassword(){ return "zszxz"; } }
5.3攔截器配置
攔截器配置中主要定義攔截請(qǐng)求規(guī)則,將攔截器注入WebMvcConfigurer;cors跨域處理;
/* * * @Author lsc * <p>攔截器配置 </p> * @Param * @Return */ @Configuration public class InterceptorConfig implements WebMvcConfigurer { /* * * @Author lsc * <p> 設(shè)置攔截路徑 </p> * @Param [registry] * @Return void */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authenticationInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/login"); } /* * * @Author lsc * <p> 將攔截器注入context </p> * @Param [] * @Return com.zszxz.jwt.interceptor.JwtInterceptor */ @Bean public JwtInterceptor authenticationInterceptor() { return new JwtInterceptor(); } /* * * @Author lsc * <p>跨域支持 </p> * @Param [registry] * @Return void */ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH", "OPTIONS", "HEAD") .maxAge(3600 * 24); } }
5.4Controller
表現(xiàn)層接口用于攔截親求測(cè)試
/** * @Author lsc * <p> </p> */ @RestController public class TestController { @GetMapping(value = "/api/test") public String get(){ return "zszxz"; } }
5.5 測(cè)試
測(cè)試url http://localhost:8080/api/test
發(fā)送get請(qǐng)求給服務(wù)器,帶有請(qǐng)求頭,key為token,value為用戶首次登陸時(shí)返回的token串;
測(cè)試返回內(nèi)容如下
zszxz
看完上述內(nèi)容,是不是對(duì)springboot+jwt實(shí)現(xiàn)token登陸權(quán)限認(rèn)證的代碼解析有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享標(biāo)題:springboot+jwt實(shí)現(xiàn)token登陸權(quán)限認(rèn)證的代碼解析
文章網(wǎng)址:http://aaarwkj.com/article12/igohgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站收錄、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、手機(jī)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)