Spring?Boot?集成并開發(fā)?Sa-token示例詳解
1 Spring Boot集成Sa-token
1.1 前言
Sa-token是一款高可用的權(quán)限認(rèn)證框架,他帶我們用最簡(jiǎn)化的配置完成用 spring security 需要進(jìn)行大量配置的才能完成的工作。
Sa-Token 是一個(gè)輕量級(jí) Java 權(quán)限認(rèn)證框架,主要解決:登錄認(rèn)證、權(quán)限認(rèn)證、單點(diǎn)登錄、OAuth2.0、分布式Session會(huì)話、微服務(wù)網(wǎng)關(guān)鑒權(quán) 等一系列權(quán)限相關(guān)問題。
官網(wǎng):https://sa-token.dev33.cn/
源碼:https://gitee.com/dromara/sa-token
1.2 集成Sa-token
在我們的基礎(chǔ)開發(fā)版本中,我們只需要引入最基礎(chǔ)依賴,現(xiàn)在的最新官方版本為:1.30.0 建議使用最新版本,如果在你的maven 倉庫中沒有該版本,需要替換maven 的鏡像源,請(qǐng)參考
<!-- Sa-Token 權(quán)限認(rèn)證, 在線文檔:http://sa-token.dev33.cn/ --> <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-spring-boot-starter</artifactId> <version>1.30.0</version> </dependency>
配置依賴后需要配置spring boot本地自定義配置
# Sa-Token 配置 sa-token: # token名稱 (同時(shí)也是cookie名稱) token-name: satoken # token有效期,單位s 默認(rèn)30天, -1代表永不過期 timeout: 2592000 # token臨時(shí)有效期 (指定時(shí)間內(nèi)無操作就視為token過期) 單位: 秒 activity-timeout: -1 # 是否允許同一賬號(hào)并發(fā)登錄 (為true時(shí)允許一起登錄, 為false時(shí)新登錄擠掉舊登錄) is-concurrent: true # 在多人登錄同一賬號(hào)時(shí),是否共用一個(gè)token (為true時(shí)所有登錄共用一個(gè)token, 為false時(shí)每次登錄新建一個(gè)token) is-share: true # token風(fēng)格 token-style: uuid # 是否輸出操作日志 is-log: false
按該配置,配置完成后即可完成基礎(chǔ)的引入,這里主要配置token 的過期和作用范圍。
token:服務(wù)端生成的一串加密字符串、以作客戶端進(jìn)行請(qǐng)求的一個(gè)“令牌”。. 當(dāng)用戶第一次使用賬號(hào)密碼成功進(jìn)行登錄后,服務(wù)器便生成一個(gè)Token及Token失效時(shí)間并將此返回給客戶端,若成功登陸,以后客戶端只需在有效時(shí)間內(nèi)帶上這個(gè)Token前來請(qǐng)求數(shù)據(jù)即可,無需再次帶上用戶名和密碼。
1.3 基礎(chǔ)使用
校驗(yàn)是否成功引入可在啟動(dòng)類下添加該語句
@SpringBootApplication @EnableScheduling public class CretApplication { public static void main(String[] args) { SpringApplication.run(CretApplication.class, args); System.out.println("啟動(dòng)成功:Sa-Token配置如下:" + SaManager.getConfig()); } }
當(dāng)控制臺(tái)輸出我們的配置內(nèi)容時(shí),證明sa-token 的依賴已經(jīng)引入,觀察輸出就會(huì)發(fā)現(xiàn)sa-token 已經(jīng)為我們初始化了很多的配置,接下的使用就會(huì)非常的簡(jiǎn)單!
啟動(dòng)成功:Sa-Token配置如下:SaTokenConfig [tokenName=satoken, timeout=2592000, activityTimeout=-1, isConcurrent=true, isShare=true, maxLoginCount=12, isReadBody=true, isReadHead=true, isReadCookie=true, tokenStyle=uuid, dataRefreshPeriod=30, tokenSessionCheckLogin=true, autoRenew=true, tokenPrefix=null, isPrint=true, isLog=false, jwtSecretKey=null, idTokenTimeout=86400, basic=, currDomain=null, checkIdToken=false, cookie=SaCookieConfig [domain=null, path=null, secure=false, httpOnly=false, sameSite=null]]
作為一個(gè)權(quán)限校驗(yàn)開發(fā)框架,他的第一個(gè)動(dòng)作便是針對(duì)我們的登錄操作,在登錄的時(shí)候便需要開始使用sa-token里面很強(qiáng)大的一個(gè)類‘ StpUtil.class’
// 會(huì)話登錄:參數(shù)填寫要登錄的賬號(hào)id,建議的數(shù)據(jù)類型:long | int | String, 不可以傳入復(fù)雜類型,如:User、Admin 等等 StpUtil.login(Object id); // 當(dāng)前會(huì)話注銷登錄 StpUtil.logout(); // 獲取當(dāng)前會(huì)話是否已經(jīng)登錄,返回true=已登錄,false=未登錄 StpUtil.isLogin(); // 檢驗(yàn)當(dāng)前會(huì)話是否已經(jīng)登錄, 如果未登錄,則拋出異常:`NotLoginException` StpUtil.checkLogin();
只需要通過簡(jiǎn)單的一句登錄,sa-token便已經(jīng)為我們生成好權(quán)限校驗(yàn)的系列組件。如果你覺得這種代碼方式的開發(fā)太繁瑣,不是那么的清晰知道當(dāng)前的權(quán)限,進(jìn)行簡(jiǎn)單的校驗(yàn),就可以開啟注解方式的校驗(yàn)。注解式校驗(yàn)的配置如下:
@Configuration public class SaTokenConfig implements WebMvcConfigurer { // 注冊(cè)Sa-Token的注解攔截器,打開注解式鑒權(quán)功能 @Override public void addInterceptors(InterceptorRegistry registry) { // 注冊(cè)注解攔截器,并排除不需要注解鑒權(quán)的接口地址 (與登錄攔截器無關(guān)) registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**"); } }
在開啟攔截器后,我們即可實(shí)現(xiàn)注解式開發(fā),像之前使用spring 注解一般。
// 檢驗(yàn)當(dāng)前會(huì)話是否已經(jīng)登錄 StpUtil.checkLogin(); //檢驗(yàn)當(dāng)前會(huì)話是否已經(jīng)登錄 @SaCheckLogin
這里的注解可直接放在一個(gè)接口上,這樣當(dāng)一個(gè)請(qǐng)求進(jìn)來的時(shí)候sa-token 的攔截器會(huì)先從請(qǐng)求中獲取自己注入 的標(biāo)識(shí) sa-token ,這個(gè)sa-token 里面包含了系列參數(shù)來保證登錄的安全正確性。
2 Spring Boot開發(fā)Sa-token
上一部分我們介紹了如何通過sa-token 實(shí)現(xiàn)最基礎(chǔ)的登錄認(rèn)證,在開發(fā)過程中我們會(huì)對(duì)sa-token 的一系列功能進(jìn)行使用,慕歌將就自己的項(xiàng)目向大家展示sa-token 的一些功能,如登錄校驗(yàn)、登錄檢測(cè)、封禁用戶,token 校驗(yàn),多租戶模式等功能
2.1 導(dǎo)入maven依賴
<!-- Sa-Token 整合 Redis (使用 jdk 默認(rèn)序列化方式) --> <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-dao-redis</artifactId> <version>1.30.0</version> </dependency> <!-- redis 緩存操作 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--連接池依賴--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>
2.2 權(quán)限校驗(yàn)
在進(jìn)行登錄驗(yàn)證的同時(shí),進(jìn)行權(quán)限校驗(yàn)也是重要的一環(huán),sa-token通過攔截器,為我們的權(quán)限校驗(yàn)進(jìn)行了拓展,讓我們可以在全局工程中隨處進(jìn)行權(quán)限控制。并且依賴于上一節(jié)介紹的注解式開發(fā),使得整個(gè)校驗(yàn)過程更加的簡(jiǎn)潔,明了。
/** * 注入權(quán)限組 */ @Component public class StpInterfaceImpl implements StpInterface { //權(quán)限 @Autowired AdminPowerMapper adminPowerMapper; //角色 @Autowired AdminRolesMapper adminRolesMapperl; /** * 用戶權(quán)限 * @param loginId 登錄id * @param s * @return */ @Override public List<String> getPermissionList(Object loginId, String s) { //獲得登錄的用戶id 對(duì)應(yīng)權(quán)限 List<String> userPermissions = adminPowerMapper.getUserPermissions(loginId); System.out.println("permiassion - list : "+userPermissions); return userPermissions; } /** * 用戶角色 * @param loginId 登錄id * @param s * @return */ @Override public List<String> getRoleList(Object loginId, String s) { //獲得登錄的用戶id 對(duì)應(yīng)角色 List<String> userRoles = adminRolesMapperl.getUserRole(loginId); System.out.println("role - list : "+userRoles); return userRoles; } }
在我的開發(fā)中,引入了兩層控制,角色表,權(quán)限表,進(jìn)行細(xì)顆粒的權(quán)限控制,更好保證數(shù)據(jù)見的隔離。附上我的角色表于權(quán)限表的設(shè)計(jì)源碼:
create table cf_admin_power ( id int unsigned auto_increment comment '權(quán)限id' primary key, code varchar(32) not null comment '權(quán)限碼', name char(32) not null comment '權(quán)限名', level char(32) not null comment '等級(jí)', icon varchar(255) null comment '圖標(biāo)', is_show tinyint unsigned default 1 not null comment '是否顯示(0:否,1:是)', status tinyint unsigned default 1 not null comment '狀態(tài)(1:可用,2:停用,3:已刪除)', create_time datetime not null comment '創(chuàng)建時(shí)間', update_time datetime not null comment '更新時(shí)間' ) comment '權(quán)限表 ' collate = utf8_unicode_ci; -- auto-generated definition create table cf_admin_roles ( id int unsigned auto_increment comment '角色id' primary key, name char(32) not null comment '角色名稱', role_info char(32) null comment '角色描述', is_super tinyint unsigned default 0 not null comment '是超級(jí)管理員(1:是,0:否)', status tinyint unsigned default 1 not null comment '狀態(tài)(1:可用,2:停用,3:已刪除)', create_time datetime null comment '創(chuàng)建時(shí)間', update_time datetime null comment '更新時(shí)間' ) comment '角色組表' collate = utf8_unicode_ci;
在為用戶注入權(quán)限后,權(quán)限的校驗(yàn)就變得簡(jiǎn)單起來了,只需要簡(jiǎn)單的注解,調(diào)用即可校驗(yàn)權(quán)限。就在這樣的一個(gè)校驗(yàn)注解,就可以實(shí)現(xiàn)用戶角色,用戶權(quán)限的檢查
// 角色認(rèn)證:必須具有指定角色才能進(jìn)入該方法 @SaCheckRole("super-admin") // 權(quán)限認(rèn)證:必須具有指定權(quán)限才能進(jìn)入該方法 @SaCheckPermission("user-add") //三個(gè)權(quán)限并列,滿足一個(gè)則通過 @SaCheckPermission(value = {"user-add", "user-all", "user-delete"}, mode = SaMode.OR) //同時(shí)滿足角色和權(quán)限,通過 @SaCheckPermission(value = "user-add", orRole = "admin")
2.3 token
框架為我們提供了多種token生成方式,以及token 的校驗(yàn)規(guī)則,將一個(gè)用戶標(biāo)記為登錄狀態(tài)后,該用戶就進(jìn)入sa-token 中進(jìn)行統(tǒng)一管理。在配置redis 后,即可實(shí)現(xiàn)到重啟數(shù)據(jù)不丟失,而且保證分布式環(huán)境下多節(jié)點(diǎn)的會(huì)話一致性。
//登錄 StpUtil.login(user.getId()); // 踢下線 StpUtil.kickout(adminUser.getId()); //凍結(jié) StpUtil.disable(adminUser.getId(), -1); // 獲取 Token 相關(guān)參數(shù) SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
在前后臺(tái)的開發(fā)中,我們可以將登錄信息回傳,即可實(shí)現(xiàn)前端通過token 建立訪問,前后端分離。前端可將登錄后返回的token 保存,之后每次進(jìn)行數(shù)據(jù)訪問時(shí)攜帶token ,后端便可以對(duì)請(qǐng)求者的權(quán)限信息校驗(yàn)。
//回傳數(shù)據(jù) "data":{11 items "tokenName":"satoken" "tokenValue":"6046ddd3-71cd-4509-b9ca-b842790bda72" "isLogin":true "loginId":"1002" "loginType":"login" "tokenTimeout":2592000 "sessionTimeout":2591999 "tokenSessionTimeout":-2 "tokenActivityTimeout":-1 "loginDevice":"default-device" "tag":NULL } //redis 緩存數(shù)據(jù) satoken:login:token:6046ddd3-71cd-4509-b9ca-b842790bda72
2.4 多租戶模式
在我的開發(fā)中,分官網(wǎng)用戶和后臺(tái)用戶,他們是完全不同的兩組數(shù)據(jù),具有各自獨(dú)立的權(quán)限,這時(shí)候需要使用到多租戶模式,對(duì)不同的用戶組維護(hù)各自的權(quán)限。sa-token為我們實(shí)現(xiàn)了一種簡(jiǎn)單的方式,對(duì)不同的組加上對(duì)應(yīng)的標(biāo)簽。之后實(shí)現(xiàn)sa-token 的校驗(yàn)?zāi)J?,便可同?biāo)準(zhǔn)使用方式一樣,對(duì)自己的用戶組校驗(yàn)。
public class StpAdminUtil { //權(quán)限組 類型 admin public static final String TYPE = "admin"; //底層logic 靜態(tài)類 public static StpLogic stpLogic = new StpLogic("admin"); public StpAdminUtil() { } public static String getLoginType() { return stpLogic.getLoginType(); } public static void setStpLogic(StpLogic stpLogic) { cn.dev33.satoken.stp.StpUtil.stpLogic = stpLogic; SaManager.putStpLogic(stpLogic); } } /** * 聚合接口 */ @Configuration public class SaMultiConfig { @Autowired public void rewriteSaStrategy() { // 重寫Sa-Token的注解處理器,增加注解合并功能 SaStrategy.me.getAnnotation = (element, annotationClass) -> { return AnnotatedElementUtils.getMergedAnnotation(element, annotationClass); }; } } /** * 登錄認(rèn)證(User版):只有登錄之后才能進(jìn)入該方法 * <p> 可標(biāo)注在函數(shù)、類上(效果等同于標(biāo)注在此類的所有方法上) */ @SaCheckLogin(type = "admin") @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD, ElementType.TYPE}) public @interface SaAdminCheckLogin { }
到此這篇關(guān)于Spring Boot 集成并開發(fā) Sa-token的文章就介紹到這了,更多相關(guān)Spring Boot 集成 Sa-token內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis實(shí)現(xiàn)數(shù)據(jù)的增刪改查實(shí)例(CRUD)
本篇文章主要介紹了Mybatis實(shí)現(xiàn)數(shù)據(jù)的增刪改查實(shí)例(CRUD),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05java使用xstream實(shí)現(xiàn)xml文件和對(duì)象之間的相互轉(zhuǎn)換
xml是一個(gè)用途比較廣泛的文件類型,在java里也自帶解析xml的包,但是本文使用的是xstream來實(shí)現(xiàn)xml和對(duì)象之間的相互轉(zhuǎn)換,xstream是一個(gè)第三方開源框架,使用起來比較方便,對(duì)java?xml和對(duì)象轉(zhuǎn)換相關(guān)知識(shí)感興趣的朋友一起看看吧2023-09-09SpringBoot使用Redis單機(jī)版過期鍵監(jiān)聽事件的實(shí)現(xiàn)示例
在緩存的使用場(chǎng)景中經(jīng)常需要使用到過期事件,本文主要介紹了SpringBoot使用Redis單機(jī)版過期鍵監(jiān)聽事件的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07Maven設(shè)置JDK版本的兩種方法實(shí)現(xiàn)
本文主要介紹了Maven設(shè)置JDK版本的兩種方法實(shí)現(xiàn),是通過Apache Maven Compiler Plugin插件實(shí)現(xiàn)的,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07