Java輕量級權(quán)限認(rèn)證框架Sa-Token的使用
前言
相信大家都用過Spring Security和Shiro的框架,Spring Security必須配合Spring 全家桶使用和繁瑣的配置,Shiro簡單易學(xué)、輕便,但個人使用下來,覺得Sa-Token比Shiro更簡單易學(xué)一點(diǎn),基本是開箱即用。
Sa-Token 是什么?
Sa-Token 是一個輕量級 Java 權(quán)限認(rèn)證框架,主要解決:登錄認(rèn)證、權(quán)限認(rèn)證、Session會話、單點(diǎn)登錄、OAuth2.0、微服務(wù)網(wǎng)關(guān)鑒權(quán) 等一系列權(quán)限相關(guān)問題。
如何使用?
引入依賴
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.29.0</version>
</dependency>示例代碼
登錄接口就一行代碼:StpUtil.login(id)
@RestController
@RequestMapping
public class LoginController {
? ? @GetMapping("doLogin")
? ? public ResultModel doLogin(String name, String pwd) {
? ? ? ? // 此處僅作模擬示例,真實(shí)項(xiàng)目需要從數(shù)據(jù)庫中查詢數(shù)據(jù)進(jìn)行比對
? ? ? ? if("jayjay".equals(name) && "123456".equals(pwd)) {
? ? ? ? ? ? StpUtil.login(1001);
? ? ? ? ? ? return ResultModel.success("登錄成功",StpUtil.getTokenInfo());
? ? ? ? }
? ? ? ? return ResultModel.error("登錄失敗");
? ? }
? ? @GetMapping("isLogin")
? ? public ResultModel isLogin() {
? ? ? ? return ResultModel.success("是否登錄:"+StpUtil.isLogin(),StpUtil.getTokenInfo());
? ? }
? ? @GetMapping("logout")
? ? public ResultModel logout() {
? ? ? ? StpUtil.logout();
? ? ? ? return ResultModel.success("登出成功");
? ? }
}我們登錄一下:

登錄成功,請求isLogin測試一下是否登錄成功并獲取當(dāng)前登錄用戶

這樣,我們就已經(jīng)完成登錄授權(quán)了,沒錯,在 Sa-Token 中,登錄認(rèn)證就是如此簡單,不需要任何的復(fù)雜前置工作,只需這一行簡單的API調(diào)用,就可以完成會話登錄認(rèn)證!
那么要怎么進(jìn)行校驗(yàn)登錄呢?只要在你需要校驗(yàn)登錄處調(diào)用這個方法就行:
// 然后在需要校驗(yàn)登錄處調(diào)用以下方法: // 如果當(dāng)前會話未登錄,這句代碼會拋出 `NotLoginException` 異常 StpUtil.checkLogin();
當(dāng)然也可以使用注解或者攔截器,這個后面再說
常用方法
在 Sa-Token 中,絕大多數(shù)功能都可以 一行代碼 完成,在這里列舉一下常用方法:
StpUtil.login(10001); // 標(biāo)記當(dāng)前會話登錄的賬號id
StpUtil.getLoginId(); // 獲取當(dāng)前會話登錄的賬號id
StpUtil.isLogin(); // 獲取當(dāng)前會話是否已經(jīng)登錄, 返回true或false
StpUtil.logout(); // 當(dāng)前會話注銷登錄
StpUtil.kickout(10001); // 將賬號為10001的會話踢下線
StpUtil.hasRole("super-admin"); // 查詢當(dāng)前賬號是否含有指定角色標(biāo)識, 返回true或false
StpUtil.hasPermission("user:add"); // 查詢當(dāng)前賬號是否含有指定權(quán)限, 返回true或false
StpUtil.getSession(); // 獲取當(dāng)前賬號id的Session
StpUtil.getSessionByLoginId(10001); // 獲取賬號id為10001的Session
StpUtil.getTokenValueByLoginId(10001); // 獲取賬號id為10001的token令牌值
StpUtil.login(10001, "PC"); // 指定設(shè)備標(biāo)識登錄,常用于“同端互斥登錄”
StpUtil.kickout(10001, "PC"); // 指定賬號指定設(shè)備標(biāo)識踢下線 (不同端不受影響)
StpUtil.openSafe(120); // 在當(dāng)前會話開啟二級認(rèn)證,有效期為120秒
StpUtil.checkSafe(); // 校驗(yàn)當(dāng)前會話是否處于二級認(rèn)證有效期內(nèi),校驗(yàn)失敗會拋出異常
StpUtil.switchTo(10044); // 將當(dāng)前會話身份臨時切換為其它賬號 常用注解
- @SaCheckLogin: 登錄認(rèn)證 —— 只有登錄之后才能進(jìn)入該方法
- @SaCheckRole("admin"): 角色認(rèn)證 —— 必須具有指定角色標(biāo)識才能進(jìn)入該方法
- @SaCheckPermission("user:add"): 權(quán)限認(rèn)證 —— 必須具有指定權(quán)限才能進(jìn)入該方法
- @SaCheckSafe: 二級認(rèn)證校驗(yàn) —— 必須二級認(rèn)證之后才能進(jìn)入該方法
- @SaCheckBasic: HttpBasic認(rèn)證 —— 只有通過 Basic 認(rèn)證后才能進(jìn)入該方法
以上注解均可在官網(wǎng)看到用法,我就不一一列舉了
不過,使用注解之前,還要把Sa-Token的攔截器開起來,默認(rèn)是關(guān)閉的
注冊攔截器
以SpringBoot2.0為例, 新建配置類SaTokenConfigure.java
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
// 注冊Sa-Token的注解攔截器,打開注解式鑒權(quán)功能
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注冊注解攔截器,并排除不需要注解鑒權(quán)的接口地址 (與登錄攔截器無關(guān))
registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
}
}保證此類被springboot啟動類掃描到即可
Spring boot 集成
集成比較簡單,只要添加依賴就行,Sa-Token在Spring Boot中是可以零配置啟動的,上面的測試用例就是零配置啟動的
當(dāng)然也可以根據(jù)自己需要在配置
1、在application.yml配置
# Sa-Token配置
sa-token:
# token名稱 (同時也是cookie名稱)
token-name: satoken
# token有效期,單位s 默認(rèn)30天, -1代表永不過期
timeout: 2592000
# token臨時有效期 (指定時間內(nèi)無操作就視為token過期) 單位: 秒
activity-timeout: -1
# 是否允許同一賬號并發(fā)登錄 (為true時允許一起登錄, 為false時新登錄擠掉舊登錄)
is-concurrent: true
# 在多人登錄同一賬號時,是否共用一個token (為true時所有登錄共用一個token, 為false時每次登錄新建一個token)
is-share: false
# token風(fēng)格
token-style: uuid
# 是否輸出操作日志
is-log: false2、通過代碼配置
/**
?* Sa-Token代碼方式進(jìn)行配置
?*/
@Configuration
public class SaTokenConfigure {
? ? // 獲取配置Bean (以代碼的方式配置Sa-Token, 此配置會覆蓋yml中的配置)
? ? @Bean
? ? @Primary
? ? public SaTokenConfig getSaTokenConfigPrimary() {
? ? ? ? SaTokenConfig config = new SaTokenConfig();
? ? ? ? config.setTokenName("satoken"); ? ? ? ? ? ? // token名稱 (同時也是cookie名稱)
? ? ? ? config.setTimeout(30 * 24 * 60 * 60); ? ? ? // token有效期,單位s 默認(rèn)30天
? ? ? ? config.setActivityTimeout(-1); ? ? ? ? ? ? ?// token臨時有效期 (指定時間內(nèi)無操作就視為token過期) 單位: 秒
? ? ? ? config.setIsConcurrent(true); ? ? ? ? ? ? ? // 是否允許同一賬號并發(fā)登錄 (為true時允許一起登錄, 為false時新登錄擠掉舊登錄)?
? ? ? ? config.setIsShare(true); ? ? ? ? ? ? ? ? ? ?// 在多人登錄同一賬號時,是否共用一個token (為true時所有登錄共用一個token, 為false時每次登錄新建一個token)?
? ? ? ? config.setTokenStyle("uuid"); ? ? ? ? ? ? ? // token風(fēng)格?
? ? ? ? config.setIsLog(false); ? ? ? ? ? ? ? ? ? ? // 是否輸出操作日志?
? ? ? ? return config;
? ? }
}上面配置并非全部配置,所有配置可以在官網(wǎng)查看,根據(jù)自己的需要選擇使用
總結(jié)
其他還有很多功能就不一一介紹了,感興趣的可以去Sa-Token官網(wǎng)了解,初步嘗試還挺不錯的,文檔和代碼示例都很全,基本功能都能滿足,源碼簡單易懂,可以隨意二開,封裝度非常高,因?yàn)槭菄碎_發(fā)的,注釋也是中文的,不用擔(dān)心看不懂。如果你想找一個開箱即用的登錄授權(quán)框架,可以選擇Sa-Token,特別是接小項(xiàng)目私活的時候賊好用!
到此這篇關(guān)于Java輕量級權(quán)限認(rèn)證框架Sa-Token的使用的文章就介紹到這了,更多相關(guān)Java Sa-Token內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文學(xué)會使用sa-token解決網(wǎng)站權(quán)限驗(yàn)證
- 初識sa-token及登錄授權(quán)簡單實(shí)現(xiàn)
- Sa-Token中的SaSession對象使用學(xué)習(xí)示例詳解
- Sa-Token記住我模式實(shí)現(xiàn)七天免登錄
- Sa-Token不同模式實(shí)現(xiàn)單地登錄?多地登錄?同端互斥登錄
- springboot 整合 sa-token簡介及入門教程
- SpringBoot?使用?Sa-Token?完成注解鑒權(quán)功能(權(quán)限校驗(yàn))
- sa-token?路由攔截式鑒權(quán)使用示例詳解
相關(guān)文章
如何使用pipeline和jacoco獲取自動化測試代碼覆蓋率
這篇文章主要介紹了如何使用pipeline和jacoco獲取自動化測試代碼覆蓋率,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
Springboot項(xiàng)目中如何讓非Spring管理的類獲得一個注入的Bean
這篇文章主要介紹了Springboot項(xiàng)目中如何讓非Spring管理的類獲得一個注入的Bean問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Java配置JDK開發(fā)環(huán)境及環(huán)境變量
這篇文章主要為大家詳細(xì)介紹了Java配置JDK開發(fā)環(huán)境及環(huán)境變量,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
SpringBoot?整合Mybatis-Plus并輸出SQL日志示例詳解
詳解javaweb中jstl如何循環(huán)List中的Map數(shù)據(jù)

