Java輕量級權(quán)限認證框架Sa-Token的使用
前言
相信大家都用過Spring Security和Shiro的框架,Spring Security必須配合Spring 全家桶使用和繁瑣的配置,Shiro簡單易學、輕便,但個人使用下來,覺得Sa-Token比Shiro更簡單易學一點,基本是開箱即用。
Sa-Token 是什么?
Sa-Token 是一個輕量級 Java 權(quán)限認證框架,主要解決:登錄認證、權(quán)限認證、Session會話、單點登錄、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ù)據(jù)庫中查詢數(shù)據(jù)進行比對 ? ? ? ? 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測試一下是否登錄成功并獲取當前登錄用戶
這樣,我們就已經(jīng)完成登錄授權(quán)了,沒錯,在 Sa-Token 中,登錄認證就是如此簡單,不需要任何的復雜前置工作,只需這一行簡單的API調(diào)用,就可以完成會話登錄認證!
那么要怎么進行校驗登錄呢?只要在你需要校驗登錄處調(diào)用這個方法就行:
// 然后在需要校驗登錄處調(diào)用以下方法: // 如果當前會話未登錄,這句代碼會拋出 `NotLoginException` 異常 StpUtil.checkLogin();
當然也可以使用注解或者攔截器,這個后面再說
常用方法
在 Sa-Token 中,絕大多數(shù)功能都可以 一行代碼 完成,在這里列舉一下常用方法:
StpUtil.login(10001); // 標記當前會話登錄的賬號id StpUtil.getLoginId(); // 獲取當前會話登錄的賬號id StpUtil.isLogin(); // 獲取當前會話是否已經(jīng)登錄, 返回true或false StpUtil.logout(); // 當前會話注銷登錄 StpUtil.kickout(10001); // 將賬號為10001的會話踢下線 StpUtil.hasRole("super-admin"); // 查詢當前賬號是否含有指定角色標識, 返回true或false StpUtil.hasPermission("user:add"); // 查詢當前賬號是否含有指定權(quán)限, 返回true或false StpUtil.getSession(); // 獲取當前賬號id的Session StpUtil.getSessionByLoginId(10001); // 獲取賬號id為10001的Session StpUtil.getTokenValueByLoginId(10001); // 獲取賬號id為10001的token令牌值 StpUtil.login(10001, "PC"); // 指定設(shè)備標識登錄,常用于“同端互斥登錄” StpUtil.kickout(10001, "PC"); // 指定賬號指定設(shè)備標識踢下線 (不同端不受影響) StpUtil.openSafe(120); // 在當前會話開啟二級認證,有效期為120秒 StpUtil.checkSafe(); // 校驗當前會話是否處于二級認證有效期內(nèi),校驗失敗會拋出異常 StpUtil.switchTo(10044); // 將當前會話身份臨時切換為其它賬號
常用注解
- @SaCheckLogin: 登錄認證 —— 只有登錄之后才能進入該方法
- @SaCheckRole("admin"): 角色認證 —— 必須具有指定角色標識才能進入該方法
- @SaCheckPermission("user:add"): 權(quán)限認證 —— 必須具有指定權(quán)限才能進入該方法
- @SaCheckSafe: 二級認證校驗 —— 必須二級認證之后才能進入該方法
- @SaCheckBasic: HttpBasic認證 —— 只有通過 Basic 認證后才能進入該方法
以上注解均可在官網(wǎng)看到用法,我就不一一列舉了
不過,使用注解之前,還要把Sa-Token的攔截器開起來,默認是關(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中是可以零配置啟動的,上面的測試用例就是零配置啟動的
當然也可以根據(jù)自己需要在配置
1、在application.yml配置
# Sa-Token配置 sa-token: # token名稱 (同時也是cookie名稱) token-name: satoken # token有效期,單位s 默認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風格 token-style: uuid # 是否輸出操作日志 is-log: false
2、通過代碼配置
/** ?* Sa-Token代碼方式進行配置 ?*/ @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 默認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風格? ? ? ? ? config.setIsLog(false); ? ? ? ? ? ? ? ? ? ? // 是否輸出操作日志? ? ? ? ? return config; ? ? } }
上面配置并非全部配置,所有配置可以在官網(wǎng)查看,根據(jù)自己的需要選擇使用
總結(jié)
其他還有很多功能就不一一介紹了,感興趣的可以去Sa-Token官網(wǎng)了解,初步嘗試還挺不錯的,文檔和代碼示例都很全,基本功能都能滿足,源碼簡單易懂,可以隨意二開,封裝度非常高,因為是國人開發(fā)的,注釋也是中文的,不用擔心看不懂。如果你想找一個開箱即用的登錄授權(quán)框架,可以選擇Sa-Token,特別是接小項目私活的時候賊好用!
到此這篇關(guān)于Java輕量級權(quán)限認證框架Sa-Token的使用的文章就介紹到這了,更多相關(guān)Java Sa-Token內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用pipeline和jacoco獲取自動化測試代碼覆蓋率
這篇文章主要介紹了如何使用pipeline和jacoco獲取自動化測試代碼覆蓋率,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11Springboot項目中如何讓非Spring管理的類獲得一個注入的Bean
這篇文章主要介紹了Springboot項目中如何讓非Spring管理的類獲得一個注入的Bean問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Java配置JDK開發(fā)環(huán)境及環(huán)境變量
這篇文章主要為大家詳細介紹了Java配置JDK開發(fā)環(huán)境及環(huán)境變量,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09

SpringBoot?整合Mybatis-Plus并輸出SQL日志示例詳解

詳解javaweb中jstl如何循環(huán)List中的Map數(shù)據(jù)