1. 程式人生 > 其它 >springboot整合sa-token框架實現使用者認證功能(使用註解形式,程式碼量極少)

springboot整合sa-token框架實現使用者認證功能(使用註解形式,程式碼量極少)

輕量級框架sa-token(已整合redis),只需呼叫api即可實現認證功能

0、匯入sa-token依賴

<dependency>
	<groupId>cn.dev33</groupId>
	<artifactId>sa-token-spring-boot-starter</artifactId>
	<version>1.27.0</version>
</dependency>
<!-- Sa-Token 整合 Redis (使用jackson序列化方式) -->
<!--Sa-token預設將會話資料儲存在記憶體中,此模式讀寫速度最快,且避免了序列化與反序列化帶來的效能消耗,
但是此模式也有一些缺點,比如:重啟後資料會丟失,無法在叢集模式下共享資料。-->
<!--引入以下依賴和配置後,框架會自動使用Redis儲存。-->
<dependency>
	<groupId>cn.dev33</groupId>
	<artifactId>sa-token-dao-redis-jackson</artifactId>
	<version>1.27.0</version>
</dependency>
<!-- 提供Redis連線池 -->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-pool2</artifactId>
</dependency>

1、編寫application.yml

# Sa-Token 配置
sa-token:
  # jwt祕鑰
  jwt-secret-key: team10ConstellationGenerator
  # token名稱 (同時也是cookie名稱)
  token-name: satoken
  # token有效期,單位s 預設30天, -1代表永不過期
  timeout: 1800
  # token臨時有效期 (指定時間內無操作就視為token過期) 單位: 秒
  activity-timeout: -1
  # 是否允許同一賬號併發登入 (為true時允許一起登入, 為false時新登入擠掉舊登入)
  is-concurrent: true
  # 在多人登入同一賬號時,是否共用一個token (為true時所有登入共用一個token, 為false時每次登入新建一個token)
  is-share: true
  # token風格
  token-style: uuid
  # 是否輸出操作日誌
  is-log: false

2、寫一個配置類,使用SaAnnotationInterceptor註解攔截請求

@Configuration
public class SaTokenConfig implements WebMvcConfigurer {

    /**
     * 攔截標註@SaCheckLogin的類或方法,必須登入才能通過校驗
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //解決靜態資源無法訪問
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/static/");
        //解決swagger無法訪問
        registry.addResourceHandler("/swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        //解決swagger的js檔案無法訪問
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars");
    }
}

注意:靜態資源配置只需在application.yml或者配置類中的一個進行配置即可,否則不生效!(作者遇到的錯誤)

3、登入和登出使用的方法

//當前使用者登入,loginId為10001
StpUtil.login(10001);
//獲取當前使用者登入的token資訊,裡面的tokenName和tokenValue在前端進行儲存,
//前端在呼叫請求時攜帶在header中(格式為{tokenName: tokenValue})
StpUtil.getTokenInfo();

//使用者登出,將loginId傳入即可
StpUtil.logout(10001);

4、在需要攔截的類或方法上標註@SaCheckLogin註解

Example:
@SaCheckLogin
public R logout(){}
@SaCheckLogin
public class TopicController {}

5、測試

登入返回結果示例如下:

最後,附上sa-token的官方文件

有興趣的小夥伴可以去嘗試其他功能噢!
若有誤,歡迎評論區指正哈~