日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

springboot+jwt实现token登陆权限认证

發布時間:2025/3/19 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot+jwt实现token登陆权限认证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

一 前言

二 jwt實現登陸認證流程

三 相關介紹jwt

3.1jwt 組成

3.2 jwt優點

四 jwt用戶登陸發放token

4.1 pom.xml

4.2jwt工具類

4.3 用戶實體

4.4Controller

4.5 測試

五 jwt登陸攔截認證

5.1自定義攔截器

5.2 service

5.3攔截器配置

5.4Controller

5.5 測試

六 官網鏈接


一 前言

此篇文章的內容也是學習不久,終于到周末有時間碼一篇文章分享知識追尋者的粉絲們,學完本篇文章,讀者將對token類的登陸認證流程有個全面的了解,可以動態搭建自己的登陸認證過程;對小項目而已是個輕量級的認證機制,符合開發需求;更多精彩原創內容關注公主號知識追尋者,讀者的肯定,就是對作者的創作的最大支持

二 jwt實現登陸認證流程

  • 用戶使用賬號和面發出post請求
  • 服務器接受到請求后使用私鑰創建一個jwt,這邊會生成token
  • 服務器返回這個jwt給瀏覽器
  • 瀏覽器需要將帶有token的jwt放入請求頭
  • 每次手到客戶端請求,服務器驗證該jwt的token
  • 驗證成功返回響應的資源給瀏覽器。否則異常處理

三 相關介紹jwt

3.1jwt 組成

JWT的token由三段信息構成的,將這三段信息文本用.連接一起就構成了JWT字符串;

  • Header 頭部(包含了令牌的元數據,并且包含簽名和或加密算法的類型)
  • Payload 負載
  • Signature 簽名/簽證
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODI4OTc4NDUsInVzZXJuYW1lIjoienN6eHoifQ.vyiExkFWCCmQA3PFYL0jJfIiYGWubngqB0WcgmtHOxg

3.2 jwt優點

  • 簡潔(Compact): 可以通過URL,POST參數或者在HTTP header發送,數據量小,傳輸速度快
  • 自包含(Self-contained):負載中包含了所有用戶所需要的信息,避免多次查詢數據庫
  • .因為Token是以JSON加密的形式保存在客戶端的,所以JWT是跨語言支持;
  • 不需要在服務端保存會話信息,適用于分布式與微服務;

四 jwt用戶登陸發放token

4.1 pom.xml

項目構件如下

  • springboot 2.1;
  • jwt 3.4.0;
  • maven 3.5
  • jdk1.8
  • postman接口測試
<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工具類

jwt工具類中有三個方法,分別是生成數字簽名用于用戶首次登陸時發送jwt給客戶端;其次是校驗方法,用于攔截器攔截所有規則內的url,每個請求都必須帶有服務器發送的jwt,經過驗證后才放行請求;最后一個獲得用戶名的方法用于查詢密鑰,在驗證jwt時作為參數傳入;

public class JwtUtil {// Token過期時間30分鐘public static final long EXPIRE_TIME = 30 * 60 * 1000;/* ** @Author lsc* <p> 校驗token是否正確 </p>* @Param token* @Param username* @Param secret* @Return boolean*/public static boolean verify(String token, String username, String secret) {try {// 設置加密算法Algorithm algorithm = Algorithm.HMAC256(secret);JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();// 效驗TOKENDecodedJWT jwt = verifier.verify(token);return true;} catch (Exception exception) {return false;}}/* ** @Author lsc* <p>生成簽名,30min后過期 </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 用戶實體

實體中包含用戶名,和密碼,一切從簡;

@Data public class SysUser {private String username;private String password;}

4.4Controller

表現層代碼用戶用戶登陸認證,認證成功后發放token給客戶端;

@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();// 省略 賬號密碼驗證// 驗證成功后發送tokenString token = JwtUtil.sign(username,password);if (token != null){map.put("code", "200");map.put("message","認證成功");map.put("token", token);return map;}map.put("code", "403");map.put("message","認證失敗");return map;} }

4.5 測試

測試url?http://localhost:8080/login

postman post請求測試參數如下

{"username": "zszxz","password": "zszxz" }

返回內容如下

{"code": "200","message": "認證成功","token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODI4OTc4NDUsInVzZXJuYW1lIjoienN6eHoifQ.vyiExkFWCCmQA3PFYL0jJfIiYGWubngqB0WcgmtHOxg" }

五 jwt登陸攔截認證

基于前面已經實現jwt登錄認證后發放token給客戶端;本節內容就是將token放入請求頭中發送請求給服務器;服務器使用攔截器攔截請求對token進行驗證;驗證成功請求通過,否則請求資源失敗;

5.1自定義攔截器

自定義攔截器JwtInterceptor,實現HandlerInterceptor接口,每次請求到達之前都會驗證token是否有效;

/*** <p>token驗證攔截器 </p>*/ @Component public class JwtInterceptor implements HandlerInterceptor {@AutowiredSysUserService sysUserService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 從 http 請求頭中取出 tokenString token = request.getHeader("token");// 如果不是映射到方法直接通過if(!(handler instanceof HandlerMethod)){return true;}if (token != null){String username = JwtUtil.getUserNameByToken(request);// 這邊拿到的 用戶名 應該去數據庫查詢獲得密碼,簡略,步驟在service直接獲取密碼boolean result = JwtUtil.verify(token,username,sysUserService.getPassword());if(result){System.out.println("通過攔截器");return true;}}return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {} }

5.2 service

/*** <p> 模擬查詢數據庫獲得賬號密碼 </p>*/ @Service public class SysUserService {public String getPassword(){return "zszxz";} }

5.3攔截器配置

攔截器配置中主要定義攔截請求規則,將攔截器注入WebMvcConfigurer;cors跨域處理;

/* ** <p>攔截器配置 </p>* @Param* @Return*/ @Configuration public class InterceptorConfig implements WebMvcConfigurer {/* ** @Author lsc* <p> 設置攔截路徑 </p>* @Param [registry]* @Return void*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(authenticationInterceptor()).addPathPatterns("/**").excludePathPatterns("/login");}/* ** @Author lsc* <p> 將攔截器注入context </p>* @Param []* @Return com.zszxz.jwt.interceptor.JwtInterceptor*/@Beanpublic JwtInterceptor authenticationInterceptor() {return new JwtInterceptor();}/* ** @Author lsc* <p>跨域支持 </p>* @Param [registry]* @Return void*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH", "OPTIONS", "HEAD").maxAge(3600 * 24);} }

5.4Controller

表現層接口用于攔截親求測試

/*** <p> </p>*/ @RestController public class TestController {@GetMapping(value = "/api/test")public String get(){return "zszxz";} }

5.5 測試

測試url?http://localhost:8080/api/test

發送get請求給服務器,帶有請求頭,key為token,value為用戶首次登陸時返回的token串;

測試返回內容如下

zszxz

六 官網鏈接

https://jwt.io/introduction/

總結

以上是生活随笔為你收集整理的springboot+jwt实现token登陆权限认证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。