springboot整合sa-token框架實現使用者認證功能(使用註解形式,程式碼量極少)
阿新 • • 發佈:2021-11-24
輕量級框架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的官方文件
有興趣的小夥伴可以去嘗試其他功能噢!
若有誤,歡迎評論區指正哈~