亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring Security基于JWT登錄認(rèn)證的項目實踐

 更新時間:2023年07月19日 15:00:43   作者:DawidZhu  
JWT被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,本文主要介紹了Spring Security基于JWT登錄認(rèn)證的項目實踐,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一言以蔽之,JWT 可以攜帶非敏感信息,并具有不可篡改性??梢酝ㄟ^驗證是否被篡改,以及讀取信息內(nèi)容,完成網(wǎng)絡(luò)認(rèn)證的三個問題:“你是誰”、“你有哪些權(quán)限”、“是不是冒充的”。  為了安全,使用它需要采用 Https 協(xié)議,并且一定要小心防止用于加密的密鑰泄露。

采用 JWT 的認(rèn)證方式下,服務(wù)端并不存儲用戶狀態(tài)信息,有效期內(nèi)無法廢棄,有效期到期后,需要重新創(chuàng)建一個新的來替換。 所以它并不適合做長期狀態(tài)保持,不適合需要用戶踢下線的場景,不適合需要頻繁修改用戶信息的場景。因為要解決這些問題,總是需要額外查詢數(shù)據(jù)庫或者緩存,或者反復(fù)加密解密,強(qiáng)扭的瓜不甜,不如直接使用 Session。不過作為服務(wù)間的短時效切換,還是非常合適的,就比如 OAuth 之類的。

目標(biāo)功能點

通過填寫用戶名和密碼登錄。

  • 通過填寫用戶名和密碼登錄。
    • 驗證成功后, 服務(wù)端生成 JWT 認(rèn)證 token, 并返回給客戶端。
    • 驗證失敗后返回錯誤信息。
    • 客戶端在每次請求中攜帶 JWT 來訪問權(quán)限內(nèi)的接口。
  • 每次請求驗證 token 有效性和權(quán)限,在無有效 token 時拋出 401 未授權(quán)錯誤。
  • 當(dāng)發(fā)現(xiàn)請求帶著的 token 有效期快到了的時候,返回特定狀態(tài)碼,重新請求一個新 token。

2.png

Spring Security是Spring家族中的安全框架,可以用來做用戶驗證和權(quán)限管理等。Spring Security是一款重型框架,不過功能十分強(qiáng)大。一般來說,如果項目中需要進(jìn)行權(quán)限管理,具有多個角色和多種權(quán)限,我們可以使用Spring Security。SpringSecurity 采用的是責(zé)任鏈的設(shè)計模式,是一堆過濾器鏈的組合,它有一條很長的過濾器鏈。

準(zhǔn)備工作

引入 Maven 依賴

針對這個登錄驗證的實現(xiàn),需要引入 Spring Security、jackson、java-jwt 三個包。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.12.1</version>
</dependency>
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.12.1</version>
</dependency>

配置 DAO 數(shù)據(jù)層

要驗證用戶前,自然是先要創(chuàng)建用戶實體對象,以及獲取用戶的服務(wù)類。不同的是,這兩個類需要實現(xiàn) Spring Security 的接口,以便將它們集成到驗證框架中。

User

用戶實體類需要實現(xiàn) ”UserDetails“ 接口,這個接口要求實現(xiàn) getUsername、getPasswordgetAuthorities 三個方法,用以獲取用戶名、密碼和權(quán)限。以及 isAccountNonExpired`isAccountNonLocked、isCredentialsNonExpiredisEnabled 這四個判斷是否是有效用戶的方法,因為和驗證無關(guān),所以先都返回 true。這里圖方便,用了 lombok。

@Data
public class User implements UserDetails {
  private static final long serialVersionUID = 1L;
  private String username;
  private String password;
  private Collection<? extends GrantedAuthority> authorities;
  ...
}

UserService

用戶服務(wù)類需要實現(xiàn) “UserDetailsService” 接口,這個接口非常簡單,只需要實現(xiàn) loadUserByUsername(String username) 這么一個方法。這里使用了 MyBatis 來連接數(shù)據(jù)庫獲取用戶信息。

@Service
public class UserService implements UserDetailsService {
  @Autowired
  UserMapper userMapper;
  @Override
  @Transactional
  public User loadUserByUsername(String username) {
      return userMapper.getByUsername(username);
  }
  ...
}

創(chuàng)建 JWT 工具類

這個工具類主要負(fù)責(zé) token 的生成,驗證,從中取值。

@Component
public class JwtTokenProvider {
  private static final long JWT_EXPIRATION = 5 * 60 * 1000L; // 五分鐘過期
  public static final String TOKEN_PREFIX = "Bearer "; // token 的開頭字符串
  private String jwtSecret = "XXX 密鑰,打死也不能告訴別人";
  ...
}

生成 JWT:從以通過驗證的認(rèn)證對象中,獲取用戶信息,然后用指定加密方式,以及過期時間生成 token。這里簡單的只加了用戶名這一個信息到 token 中:

public String generateToken(Authentication authentication) {
    User userPrincipal = (User) authentication.getPrincipal(); // 獲取用戶對象
    Date expireDate = new Date(System.currentTimeMillis() + JWT_EXPIRATION); // 設(shè)置過期時間
    try {
        Algorithm algorithm = Algorithm.HMAC256(jwtSecret); // 指定加密方式
        return JWT.create().withExpiresAt(expireDate).withClaim("username", userPrincipal.getUsername()) 
                .sign(algorithm); // 簽發(fā) JWT
    } catch (JWTCreationException jwtCreationException) {
        return null;
    }
}

驗證 JWT:指定和簽發(fā)相同的加密方式,驗證這個 token 是否是本服務(wù)器簽發(fā),是否篡改,或者已過期。

public boolean validateToken(String authToken) {
    try {
        Algorithm algorithm = Algorithm.HMAC256(jwtSecret); // 和簽發(fā)保持一致
        JWTVerifier verifier = JWT.require(algorithm).build();
        verifier.verify(authToken);
        return true;
    } catch (JWTVerificationException jwtVerificationException) {
        return false;
    }
}

獲取荷載信息:從 token 的荷載部分里解析用戶名信息,這部分是 md5 編碼的,屬于公開信息。

public String getUsernameFromJWT(String authToken) {
    try {
        DecodedJWT jwt = JWT.decode(authToken);
        return jwt.getClaim("username").asString();
    } catch (JWTDecodeException jwtDecodeException) {
        return null;
    }
}

登錄

登錄部分需要創(chuàng)建三個文件:負(fù)責(zé)登錄接口處理的攔截器,登陸成功或者失敗的處理類。

LoginFilter

Spring Security 默認(rèn)自帶表單登錄,負(fù)責(zé)處理這個登錄驗證過程的過濾器叫“UsernamePasswordAuthenticationFilter”,不過它只支持表單傳值,這里用自定義的類繼承它,使其能夠支持 JSON 傳值,負(fù)責(zé)登錄驗證接口。

這個攔截器只需要負(fù)責(zé)從請求中取值即可,驗證工作 Spring Security 會幫我們處理好。

參考文章

滑動驗證頁面

SpringBoot整合Spring Security + JWT實現(xiàn)用戶認(rèn)證-阿里云開發(fā)者社區(qū) 

到此這篇關(guān)于Spring Security基于JWT登錄認(rèn)證的項目實踐的文章就介紹到這了,更多相關(guān)Spring Security JWT登錄認(rèn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringCloud Feign轉(zhuǎn)發(fā)請求頭(防止session失效)的解決方案

    SpringCloud Feign轉(zhuǎn)發(fā)請求頭(防止session失效)的解決方案

    這篇文章主要介紹了SpringCloud Feign轉(zhuǎn)發(fā)請求頭(防止session失效)的解決方案,本文給大家分享兩種解決方案供大家參考,感興趣的朋友跟隨小編一起看看吧
    2020-10-10
  • Mybatis中攔截器的使用場景和技巧分享

    Mybatis中攔截器的使用場景和技巧分享

    Mybatis提供了一些機(jī)制,可以允許我們在做數(shù)據(jù)庫操作的時候進(jìn)行我們額外的一些程序,當(dāng)然,這看起來并沒有JPA的EntityListener好用,本文小編將給大家詳細(xì)的介紹了Mybatis中攔截器的使用場景和技巧,需要的朋友可以參考下
    2023-10-10
  • 用java開發(fā)dota英雄最華麗的技能(實例講解)

    用java開發(fā)dota英雄最華麗的技能(實例講解)

    下面小編就為大家分享一篇使用java開發(fā)dota英雄最華麗的技能實例,具有非常好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • swing登錄注冊界面設(shè)計

    swing登錄注冊界面設(shè)計

    這篇文章主要為大家詳細(xì)介紹了swing登錄注冊界面的設(shè)計方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Ubuntu下配置Tomcat服務(wù)器以及設(shè)置自動啟動的方法

    Ubuntu下配置Tomcat服務(wù)器以及設(shè)置自動啟動的方法

    這篇文章主要介紹了Ubuntu下配置Tomcat服務(wù)器以及設(shè)置自動啟動的方法,適用于Java的web程序開發(fā),需要的朋友可以參考下
    2015-10-10
  • Spring+Quartz配置定時任務(wù)實現(xiàn)代碼

    Spring+Quartz配置定時任務(wù)實現(xiàn)代碼

    這篇文章主要介紹了Spring+Quartz配置定時任務(wù)實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • JDBC的ResultSet使用說明

    JDBC的ResultSet使用說明

    今天小編就為大家分享一篇JDBC的ResultSet使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • 詳解springboot shiro jwt實現(xiàn)權(quán)限管理

    詳解springboot shiro jwt實現(xiàn)權(quán)限管理

    為什么使用jwt呢,因為可以通過URL,POST參數(shù)或者在HTTP header發(fā)送,因為數(shù)據(jù)量小,傳輸速度也很快。本篇通過具體代碼來進(jìn)行詳情解析,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值
    2021-09-09
  • Spring高級注解@PropertySource詳細(xì)解讀

    Spring高級注解@PropertySource詳細(xì)解讀

    這篇文章主要介紹了Spring高級注解@PropertySource詳細(xì)解讀,@PropertySource注解用于指定資源文件讀取的位置,它不僅能讀取properties文件,也能讀取xml文件,并且通過YAML解析器,配合自定義PropertySourceFactory實現(xiàn)解析yaml文件,需要的朋友可以參考下
    2023-11-11
  • Java 實現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù)

    Java 實現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù)

    這篇文章主要介紹了Java 實現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù) ,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05

最新評論