Sa-Token不同模式實(shí)現(xiàn)單地登錄?多地登錄?同端互斥登錄
一、需求分析
如果你經(jīng)常使用騰訊QQ,就會(huì)發(fā)現(xiàn)它的登錄有如下特點(diǎn):它可以手機(jī)電腦同時(shí)在線,但是不能在兩個(gè)手機(jī)上同時(shí)登錄一個(gè)賬號(hào)。
同端互斥登錄,指的就是:像騰訊QQ一樣,在同一類型設(shè)備上只允許單地點(diǎn)登錄,在不同類型設(shè)備上允許同時(shí)在線。
動(dòng)態(tài)演示圖:
Sa-Token 是一個(gè)輕量級(jí) java 權(quán)限認(rèn)證框架,主要解決登錄認(rèn)證、權(quán)限認(rèn)證、單點(diǎn)登錄、OAuth2、微服務(wù)網(wǎng)關(guān)鑒權(quán) 等一系列權(quán)限相關(guān)問(wèn)題。
Gitee 開源地址:https://gitee.com/dromara/sa-token
本文將介紹在 Sa-Token 中,如何實(shí)現(xiàn)以下登錄策略:
- 單地登錄:指一個(gè)賬號(hào)同一時(shí)間只能在一個(gè)地方登錄,新登錄會(huì)擠掉舊登錄,也可以叫:?jiǎn)味说卿洝?/li>
- 多地登錄:指一個(gè)賬號(hào)同一時(shí)間可以在不同地方登錄,新登錄會(huì)和舊登錄共存,也可以叫:多端登錄。
- 同端互斥登錄:在同一類型設(shè)備上只允許單地點(diǎn)登錄,在不同類型設(shè)備上允許同時(shí)在線,參考騰訊QQ的登錄模式:手機(jī)和電腦可以同時(shí)在線,但不能兩個(gè)手機(jī)同時(shí)在線。
與之對(duì)應(yīng)的,注銷策略也將分為以下幾種:
- 單端注銷:只在調(diào)用退出的一端注銷。
- 全端注銷:一端注銷,全端下線。
- 同端注銷:例如將所有手機(jī)端注銷下線,PC端不受影響。
二、多地登錄
此模式較為簡(jiǎn)單,Sa-Token 默認(rèn)模式即為多地登錄模式。
1、首先引入 Sa-Token 依賴:
<!-- Sa-Token 權(quán)限認(rèn)證 --> <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-spring-boot-starter</artifactId> <version>1.34.0</version> </dependency>
注:如果你使用的是 SpringBoot 3.x
,只需要將 sa-token-spring-boot-starter
修改為 sa-token-spring-boot3-starter
即可。
2、在用戶登錄時(shí)將賬號(hào)id寫入會(huì)話中
@RestController @RequestMapping("/user/") public class UserController { @RequestMapping("doLogin") public SaResult doLogin(String username, String password) { // 此處僅作示例模擬,真實(shí)項(xiàng)目需要從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)進(jìn)行比對(duì) if("zhang".equals(username) && "123456".equals(password)) { StpUtil.login(10001); return SaResult.ok("登錄成功"); } return SaResult.ok("登錄失敗"); } }
啟動(dòng)類:
@SpringBootApplication public class SaTokenDemoApplication { public static void main(String[] args) { SpringApplication.run(SaTokenDemoApplication.class, args); System.out.println("\n啟動(dòng)成功:Sa-Roken 配置如下:" + SaManager.getConfig()); } }
如上代碼,在多人登錄同一賬號(hào)時(shí)將不會(huì)對(duì)舊會(huì)話做任何處理,同一賬號(hào)可以在多個(gè)地點(diǎn)任意登錄,互不影響。
3、如果要全端注銷,可以調(diào)用 logout
方法:
// 會(huì)話注銷 @RequestMapping("logout") public SaResult logout() { StpUtil.logout(); return SaResult.ok("退出登錄成功"); }
調(diào)用如上方法注銷后,當(dāng)前賬號(hào)所有端將一起下線。
4、單端注銷
如果要只注銷一端,可將配置文件中 is-share
的值配置為 false
sa-token: is-share: false
此配置項(xiàng)的含義為:在多人登錄同一賬號(hào)時(shí),是否共用一個(gè) Token。
- 為 true 時(shí):所有登錄共用一個(gè) Token。
- 為 false 時(shí):每次登錄新建一個(gè) Token。
此值為 false 后,每次登錄都將返回不同的 Token,與之對(duì)應(yīng)的,調(diào)用 StpUtil.logout()
也只會(huì)注銷掉當(dāng)前的 Token,其他端不受影響。
三、單地登錄
單地登錄的重點(diǎn)是需要改一下 yml 配置文件:
sa-token: is-concurrent: false
is-concurrent
的含義為是否允許同一賬號(hào)并發(fā)登錄:
- 為 true 時(shí):允許一起登錄。
- 為 false 時(shí):新登錄擠掉舊登錄。
其它代碼與 [多地登錄](méi) 無(wú)異,當(dāng)我們?cè)趦蓚€(gè)瀏覽器分別登錄同一賬號(hào)時(shí),舊會(huì)話再次訪問(wèn)系統(tǒng)將會(huì)得到如下提示:
{ "code": 401, "msg": "Token 已被頂下線", "data": null }
在 單地登錄 模式中,不存在注銷策略的問(wèn)題,因?yàn)橥粫r(shí)間內(nèi),一個(gè)賬號(hào)最多在一個(gè)設(shè)備在線,只要調(diào)用注銷,就必然是全端下線。
四、同端互斥登錄
好了,終于輪到主角出場(chǎng),同端互斥登錄可以讓我們像騰訊QQ
一樣,在同一類型設(shè)備上只允許單地點(diǎn)登錄,在不同類型設(shè)備上允許同時(shí)在線。
那么在 Sa-Token 中如何做到同端互斥登錄呢?
首先如 單地登錄
一樣,在配置文件中,將 sa-token.is-concurrent
配置為false
,然后調(diào)用登錄等相關(guān)接口時(shí)聲明設(shè)備標(biāo)識(shí)即可:
1、指定設(shè)備標(biāo)識(shí)登錄
StpUtil.login(10001, "PC");
調(diào)用此方法登錄后,同設(shè)備的會(huì)被頂下線(不同設(shè)備不受影響),再次訪問(wèn)系統(tǒng)時(shí)會(huì)拋出 NotLoginException
異常,場(chǎng)景值=-4
場(chǎng)景值 | 對(duì)應(yīng)常量 | 含義說(shuō)明 |
---|---|---|
-1 | NotLoginException.NOT_TOKEN | 未能從請(qǐng)求中讀取到 Token |
-2 | NotLoginException.INVALID_TOKEN | 已讀取到 Token,但是 Token無(wú)效 |
-3 | NotLoginException.TOKEN_TIMEOUT | 已讀取到 Token,但是 Token已經(jīng)過(guò)期 |
-4 | NotLoginException.BE_REPLACED | 已讀取到 Token,但是 Token 已被頂下線 |
-5 | NotLoginException.KICK_OUT | 已讀取到 Token,但是 Token 已被踢下線 |
如果第二個(gè)參數(shù)填寫null或不填,代表將這個(gè)賬號(hào)id所有在線端踢下線,被踢出者再次訪問(wèn)系統(tǒng)時(shí)會(huì)拋出 NotLoginException
異常,場(chǎng)景值=-5
2、查詢當(dāng)前登錄的設(shè)備標(biāo)識(shí)
StpUtil.getLoginDevice();
如果在登錄時(shí)未指定設(shè)備類型值,調(diào)用此方法將返回默認(rèn)值:default-device
。
3、指定設(shè)備端類型下線
業(yè)務(wù)場(chǎng)景舉例:在手機(jī)端控制PC端下線(手機(jī)端本身不受影響)
StpUtil.logout(10001, "PC");
4、全端下線
在調(diào)用 logout
方法時(shí),不填寫具體的設(shè)備端類型,將默認(rèn)控制所有端一起下線。
StpUtil.logout(10001);
以上就是 Sa-Token 框架在處理登錄問(wèn)題時(shí)的各種方案,可以看出不管是簡(jiǎn)單的多地登錄還是復(fù)雜的同端互斥登錄,在 Sa-Token 都有完善的解決方案。
參考資料
- Sa-Token 文檔:https://sa-token.cc
- Gitee 倉(cāng)庫(kù)地址:https://gitee.com/dromara/sa-token
- GitHub 倉(cāng)庫(kù)地址:https://github.com/dromara/sa-token
以上就是Sa-Token不同模式實(shí)現(xiàn)單地登錄 多地登錄 同端互斥登錄的詳細(xì)內(nèi)容,更多關(guān)于Sa-Token登錄模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 一文學(xué)會(huì)使用sa-token解決網(wǎng)站權(quán)限驗(yàn)證
- 初識(shí)sa-token及登錄授權(quán)簡(jiǎn)單實(shí)現(xiàn)
- Sa-Token中的SaSession對(duì)象使用學(xué)習(xí)示例詳解
- Sa-Token記住我模式實(shí)現(xiàn)七天免登錄
- springboot 整合 sa-token簡(jiǎn)介及入門教程
- SpringBoot?使用?Sa-Token?完成注解鑒權(quán)功能(權(quán)限校驗(yàn))
- Java輕量級(jí)權(quán)限認(rèn)證框架Sa-Token的使用
- sa-token?路由攔截式鑒權(quán)使用示例詳解
相關(guān)文章
Jmeter對(duì)響應(yīng)數(shù)據(jù)實(shí)現(xiàn)斷言代碼實(shí)例
這篇文章主要介紹了Jmeter對(duì)響應(yīng)數(shù)據(jù)實(shí)現(xiàn)斷言代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Elasticsearch寫入瓶頸導(dǎo)致skywalking大盤空白
這篇文章主要為大家介紹了Elasticsearch寫入瓶頸導(dǎo)致skywalking大盤空白的解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02使用ServletInputStream在攔截器或過(guò)濾器中應(yīng)用后重寫
這篇文章主要介紹了使用ServletInputStream在攔截器或過(guò)濾器中應(yīng)用后重寫,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10SpringCloud中使用webclient(get和post)請(qǐng)求微服務(wù)接口數(shù)據(jù)
在SpringCloud項(xiàng)目中使用WebClient調(diào)用微服務(wù)時(shí),涉及配置WebClient、發(fā)起get和post請(qǐng)求等操作,如請(qǐng)求頭設(shè)置、服務(wù)地址配置、數(shù)據(jù)轉(zhuǎn)換處理、異常處理等,避免在循環(huán)中使用WebClient請(qǐng)求、路徑設(shè)置細(xì)節(jié)以及數(shù)據(jù)返回處理技巧,本文旨在幫助理解和應(yīng)用WebClient進(jìn)行微服務(wù)調(diào)用2024-10-10使用spring boot開發(fā)時(shí)java對(duì)象和Json對(duì)象轉(zhuǎn)換的問(wèn)題
這篇文章主要介紹了使用spring boot開發(fā)時(shí)java對(duì)象和Json對(duì)象轉(zhuǎn)換的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03logback EvaluatorFilter實(shí)現(xiàn)同時(shí)記錄多個(gè)level級(jí)別的日志
這篇文章主要介紹了logback EvaluatorFilter實(shí)現(xiàn)同時(shí)記錄多個(gè)level級(jí)別的日志方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11java swing實(shí)現(xiàn)電影購(gòu)票系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java swing實(shí)現(xiàn)電影購(gòu)票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Jenkins+maven持續(xù)集成的實(shí)現(xiàn)
這篇文章主要介紹了Jenkins+maven持續(xù)集成的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04java使用DelayQueue實(shí)現(xiàn)延時(shí)任務(wù)
項(xiàng)目中經(jīng)常會(huì)用到類似一些需要延遲執(zhí)行的功能,比如緩存,java提供了DelayQueue來(lái)很輕松的實(shí)現(xiàn)這種功能,下面小編就來(lái)和大家介紹一下如何使用DelayQueue實(shí)現(xiàn)延時(shí)任務(wù)吧2023-10-10