欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot+jwt實現(xiàn)token登陸權(quán)限認證的實現(xiàn)

 更新時間:2020年06月04日 09:21:18   作者:知識追尋者  
這篇文章主要介紹了springboot+jwt實現(xiàn)token登陸權(quán)限認證的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一 前言

此篇文章的內(nèi)容也是學(xué)習(xí)不久,終于到周末有時間碼一篇文章分享知識追尋者的粉絲們,學(xué)完本篇文章,讀者將對token類的登陸認證流程有個全面的了解,可以動態(tài)搭建自己的登陸認證過程;對小項目而已是個輕量級的認證機制,符合開發(fā)需求;

二 jwt實現(xiàn)登陸認證流程

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

三 相關(guān)介紹jwt

3.1jwt 組成

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

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

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODI4OTc4NDUsInVzZXJuYW1lIjoienN6eHoifQ.vyiExkFWCCmQA3PFYL0jJfIiYGWubngqB0WcgmtHOxg

3.2 jwt優(yōu)點

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

四 jwt用戶登陸發(fā)放token

4.1 pom.xml

項目構(gòu)件如下

  • 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工具類中有三個方法,分別是生成數(shù)字簽名用于用戶首次登陸時發(fā)送jwt給客戶端;其次是校驗方法,用于攔截器攔截所有規(guī)則內(nèi)的url,每個請求都必須帶有服務(wù)器發(fā)送的jwt,經(jīng)過驗證后才放行請求;最后一個獲得用戶名的方法用于查詢密鑰,在驗證jwt時作為參數(shù)傳入;

/* *
 * @Author lsc
 * <p> JWT工具類 </p>
 * @Param
 * @Return
 */
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 {
 // 設(shè)置加密算法
 Algorithm algorithm = Algorithm.HMAC256(secret);
 JWTVerifier verifier = JWT.require(algorithm)
  .withClaim("username", username)
  .build();
 // 效驗TOKEN
 DecodedJWT 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 用戶實體

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

/**
 * @Author lsc
 * <p> </p>
 */
@Data
public class SysUser {
 private String username;
 private String password;
}

4.4Controller

表現(xià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();
  // 省略 賬號密碼驗證
  // 驗證成功后發(fā)送token
  String 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請求測試參數(shù)如下

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

返回內(nèi)容如下

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

五 jwt登陸攔截認證

基于前面已經(jīng)實現(xiàn)jwt登錄認證后發(fā)放token給客戶端;本節(jié)內(nèi)容就是將token放入請求頭中發(fā)送請求給服務(wù)器;服務(wù)器使用攔截器攔截請求對token進行驗證;驗證成功請求通過,否則請求資源失敗;

5.1自定義攔截器

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

/**
 * @Author lsc
 * <p>token驗證攔截器 </p>
 */
@Component
public class JwtInterceptor implements HandlerInterceptor {

 @Autowired
 SysUserService sysUserService;

 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  // 從 http 請求頭中取出 token
  String token = request.getHeader("token");
  // 如果不是映射到方法直接通過
  if(!(handler instanceof HandlerMethod)){
   return true;
  }
  if (token != null){
   String username = JwtUtil.getUserNameByToken(request);
   // 這邊拿到的 用戶名 應(yīng)該去數(shù)據(jù)庫查詢獲得密碼,簡略,步驟在service直接獲取密碼
   boolean result = JwtUtil.verify(token,username,sysUserService.getPassword());
   if(result){
    System.out.println("通過攔截器");
    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> 模擬查詢數(shù)據(jù)庫獲得賬號密碼 </p>
 */
@Service
public class SysUserService {


 public String getPassword(){
  return "zszxz";
 }
}

5.3攔截器配置

攔截器配置中主要定義攔截請求規(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)層接口用于攔截親求測試

/**
 * @Author lsc
 * <p> </p>
 */
@RestController
public class TestController {

 @GetMapping(value = "/api/test")
 public String get(){

  return "zszxz";
 }
}

5.5 測試

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

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

測試返回內(nèi)容如下

zszxz

六 官網(wǎng)鏈接

https://jwt.io/introduction/

到此這篇關(guān)于springboot+jwt實現(xiàn)token登陸權(quán)限認證的實現(xiàn)的文章就介紹到這了,更多相關(guān)springboot jwt token登陸權(quán)限 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring的兩種事務(wù)管理機制的基本概念和demo示例

    Spring的兩種事務(wù)管理機制的基本概念和demo示例

    Spring事務(wù)包括聲明式事務(wù)管理和注解式事務(wù)管理,我們通過概念和小demo的形式一步一步地來一起學(xué)習(xí)這個知識點,需要的朋友可以參考下
    2023-07-07
  • Java運算符的知識點與代碼匯總

    Java運算符的知識點與代碼匯總

    這篇文章主要給大家總結(jié)介紹了關(guān)于Java運算符知識點與代碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 解決使用@RequestParam注解和泛型遇到的問題

    解決使用@RequestParam注解和泛型遇到的問題

    這篇文章主要介紹了解決使用@RequestParam注解和泛型遇到的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java中l(wèi)ambda表達式簡單用例

    java中l(wèi)ambda表達式簡單用例

    讓我們從最簡單的例子開始,來學(xué)習(xí)如何對一個string列表進行排序。我們首先使用Java 8之前的方法來實現(xiàn)
    2016-09-09
  • Spring?Security放行的接口Knife4j靜態(tài)資源的問題小結(jié)

    Spring?Security放行的接口Knife4j靜態(tài)資源的問題小結(jié)

    這篇文章主要介紹了Spring?Security使用Knife4j靜態(tài)資源的問題小結(jié),項目中使用?Spring?Security?做身份認證和授權(quán),使用?Knife4j?做接口調(diào)試,需要?Spring?Security?放行的接口記錄在?RequestMatcherConstant?類中,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • Java中方法名稱和泛型相同的用法示例

    Java中方法名稱和泛型相同的用法示例

    這篇文章主要介紹了Java中方法名稱和泛型相同的用法,結(jié)合實例形式分析了泛型替代方法名稱的相關(guān)使用技巧,需要的朋友可以參考下
    2019-08-08
  • Spring?Data?Jpa返回自定義對象的3種方法實例

    Spring?Data?Jpa返回自定義對象的3種方法實例

    在使用Spring Data Jpa框架時,根據(jù)業(yè)務(wù)需求我們通常需要進行復(fù)雜的數(shù)據(jù)庫查詢,下面這篇文章主要給大家介紹了關(guān)于Spring?Data?Jpa返回自定義對象的3種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • SpringBoot如何獲取application.properties中自定義的值

    SpringBoot如何獲取application.properties中自定義的值

    這篇文章主要介紹了SpringBoot獲取application.properties中的自定義的值,目錄結(jié)構(gòu)文件代碼給大家列舉的非常詳細,需要的朋友可以參考下
    2021-09-09
  • Java靜態(tài)和非靜態(tài)成員變量初始化過程解析

    Java靜態(tài)和非靜態(tài)成員變量初始化過程解析

    這篇文章主要介紹了Java靜態(tài)和非靜態(tài)成員變量初始化過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • 關(guān)于Java中修飾符的總結(jié)(fina除外)

    關(guān)于Java中修飾符的總結(jié)(fina除外)

    下面小編就為大家?guī)硪黄P(guān)于Java中修飾符的總結(jié)(fina除外)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09

最新評論