国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Sa-Token 多賬號(hào)認(rèn)證:同時(shí)為系統(tǒng)的 Admin 賬號(hào)和 User 賬號(hào)提供鑒權(quán)操作

這篇具有很好參考價(jià)值的文章主要介紹了Sa-Token 多賬號(hào)認(rèn)證:同時(shí)為系統(tǒng)的 Admin 賬號(hào)和 User 賬號(hào)提供鑒權(quán)操作。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

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)問題。

Gitee 開源地址:https://gitee.com/dromara/sa-token

本篇將介紹 Sa-Token 中的多賬號(hào)認(rèn)證操作。

一、需求分析

有的時(shí)候,我們會(huì)在一個(gè)項(xiàng)目中設(shè)計(jì)兩套賬號(hào)體系,比如一個(gè)電商系統(tǒng)的 user表 和 admin表, 在這種場(chǎng)景下,如果兩套賬號(hào)我們都使用 StpUtil 類的API進(jìn)行登錄鑒權(quán),那么勢(shì)必會(huì)發(fā)生邏輯沖突。

在Sa-Token中,這個(gè)問題的模型叫做:多賬號(hào)體系認(rèn)證。

要解決這個(gè)問題,我們必須有一個(gè)合理的機(jī)制將這兩套賬號(hào)的授權(quán)給區(qū)分開,讓它們互不干擾才行。

二、演進(jìn)思路

假如說我們的 user表 和 admin表 都有一個(gè) id=10001 的賬號(hào),它們對(duì)應(yīng)的登錄代碼:StpUtil.login(10001) 是一樣的,
那么問題來了:在StpUtil.getLoginId()獲取到的賬號(hào)id如何區(qū)分它是User用戶,還是Admin用戶?

你可能會(huì)想到為他們加一個(gè)固定前綴,比如StpUtil.login("User_" + 10001)、StpUtil.login("Admin_" + 10001),這樣確實(shí)是可以解決問題的,
但是同樣的:你需要在StpUtil.getLoginId()時(shí)再裁剪掉相應(yīng)的前綴才能獲取真正的賬號(hào)id,這樣一增一減就讓我們的代碼變得無比啰嗦。

那么,有沒有從框架層面支持的,更優(yōu)雅的解決方案呢?

SaManager 提供了動(dòng)態(tài)創(chuàng)建 StpLogic 的能力:

// 在當(dāng)前會(huì)話登錄 Admin 賬號(hào) 10001
SaManager.getStpLogic("admin").login(10001);

// 在當(dāng)前會(huì)話登錄 User 賬號(hào) 10001
SaManager.getStpLogic("user").login(10001);

這是一種解決方案,但仍然需要我們每次調(diào)用方法時(shí)指定賬號(hào)類型參數(shù),代碼略顯啰嗦,接下來我們介紹方案二:自定義 StpUtil 鑒權(quán)工具類。

三、自定義 StpUtil 鑒權(quán)工具類

前面幾篇介紹的api調(diào)用,都是經(jīng)過 StpUtil 類的各種靜態(tài)方法進(jìn)行授權(quán)認(rèn)證,
而如果我們深入它的源碼,點(diǎn)此閱覽

就會(huì)發(fā)現(xiàn),此類并沒有任何代碼邏輯,唯一做的事就是對(duì)成員變量stpLogic的各個(gè)API包裝一下進(jìn)行轉(zhuǎn)發(fā)。

這樣做有兩個(gè)優(yōu)點(diǎn):

  • StpLogic 類的所有函數(shù)都可以被重寫,按需擴(kuò)展。
  • 在構(gòu)造方法時(shí)隨意傳入一個(gè)不同的 loginType,就可以再造一套賬號(hào)登錄體系。

四、操作示例

比如說,對(duì)于原生StpUtil類,我們只做admin賬號(hào)權(quán)限認(rèn)證,而對(duì)于user賬號(hào),我們則:

  1. 新建一個(gè)新的權(quán)限認(rèn)證類,比如: StpUserUtil.java。
  2. StpUtil.java類的全部代碼復(fù)制粘貼到 StpUserUtil.java里。
  3. 更改一下其 LoginType, 比如:
public class StpUserUtil {
	
	/**
	 * 賬號(hào)體系標(biāo)識(shí) 
	 */
	public static final String TYPE = "user";	// 將 LoginType 從`login`改為`user` 

	// 其它代碼 ... 

}
  1. 接下來就可以像調(diào)用StpUtil.java一樣調(diào)用 StpUserUtil.java了,這兩套賬號(hào)認(rèn)證的邏輯是完全隔離的。

成品樣例參考:碼云 StpUserUtil.java

五、在多賬戶模式下使用注解鑒權(quán)

框架默認(rèn)的注解鑒權(quán) 如@SaCheckLogin 只針對(duì)原生StpUtil進(jìn)行鑒權(quán)。

例如,我們?cè)谝粋€(gè)方法上加上@SaCheckLogin注解,這個(gè)注解只會(huì)放行通過StpUtil.login(id)進(jìn)行登錄的會(huì)話,
而對(duì)于通過StpUserUtil.login(id)進(jìn)行登錄的會(huì)話,則始終不會(huì)通過校驗(yàn)。

那么如何告訴@SaCheckLogin要鑒別的是哪套賬號(hào)的登錄會(huì)話呢?很簡(jiǎn)單,你只需要指定一下注解的type屬性即可:

// 通過type屬性指定此注解校驗(yàn)的是我們自定義的`StpUserUtil`,而不是原生`StpUtil`
@SaCheckLogin(type = StpUserUtil.TYPE)
@RequestMapping("info")
public String info() {
    return "查詢用戶信息";
}

注:@SaCheckRole("xxx")、@SaCheckPermission("xxx")同理,亦可根據(jù)type屬性指定其校驗(yàn)的賬號(hào)體系,此屬性默認(rèn)為"",代表使用原生StpUtil賬號(hào)體系。

六、使用注解合并簡(jiǎn)化代碼

交流群里有同學(xué)反應(yīng),雖然可以根據(jù) @SaCheckLogin(type = "user") 指定賬號(hào)類型,但幾十上百個(gè)注解都加上這個(gè)的話,還是有些繁瑣,代碼也不夠優(yōu)雅,有么有更簡(jiǎn)單的解決方案?

我們期待一種[注解繼承/合并]的能力,即:自定義一個(gè)注解,標(biāo)注上@SaCheckLogin(type = "user")
然后在方法上標(biāo)注這個(gè)自定義注解,效果等同于標(biāo)注@SaCheckLogin(type = "user")

很遺憾,JDK默認(rèn)的注解處理器并沒有提供這種[注解繼承/合并]的能力,不過好在我們可以利用 Spring 的注解處理器,達(dá)到同樣的目的。

1、重寫Sa-Token默認(rèn)的注解處理器:
@Configuration
public class SaTokenConfigure {
    @Autowired
    public void rewriteSaStrategy() {
    	// 重寫Sa-Token的注解處理器,增加注解合并功能 
		SaStrategy.me.getAnnotation = (element, annotationClass) -> {
			return AnnotatedElementUtils.getMergedAnnotation(element, annotationClass); 
		};
    }
}
2、自定義一個(gè)注解:
/**
 * 登錄認(rèn)證(User版):只有登錄之后才能進(jìn)入該方法 
 * <p> 可標(biāo)注在函數(shù)、類上(效果等同于標(biāo)注在此類的所有方法上) 
 */
@SaCheckLogin(type = "user")
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE})
public @interface SaUserCheckLogin {
	
}
3、接下來就可以使用我們的自定義注解了:
// 使用 @SaUserCheckLogin 的效果等同于使用:@SaCheckLogin(type = "user")
@SaUserCheckLogin
@RequestMapping("info")
public String info() {
    return "查詢用戶信息";
}

注:其它注解 @SaCheckRole("xxx")、@SaCheckPermission("xxx")同理,
完整示例參考:碼云:自定義注解。

七、同端多登陸

假設(shè)我們不僅需要在后臺(tái)同時(shí)集成兩套賬號(hào),我們還需要在一個(gè)客戶端同時(shí)登陸兩套賬號(hào)(業(yè)務(wù)場(chǎng)景舉例:一個(gè)APP中可以同時(shí)登陸商家賬號(hào)和用戶賬號(hào))。

如果我們不做任何特殊處理的話,在客戶端會(huì)發(fā)生token覆蓋,新登錄的token會(huì)覆蓋掉舊登錄的token從而導(dǎo)致舊登錄失效。

那么如何解決這個(gè)問題?

很簡(jiǎn)單,我們只要更改一下 StpUserUtilTokenName 即可,參考示例如下:

public class StpUserUtil {
	
	// 使用匿名子類 重寫`stpLogic對(duì)象`的一些方法 
	public static StpLogic stpLogic = new StpLogic("user") {
		// 重寫 StpLogic 類下的 `splicingKeyTokenName` 函數(shù),返回一個(gè)與 `StpUtil` 不同的token名稱, 防止沖突 
		@Override
		public String splicingKeyTokenName() {
			return super.splicingKeyTokenName() + "-user";
		}
		// 同理你可以按需重寫一些其它方法 ... 
	}; 
	
	// ... 
	
}

再次調(diào)用 StpUserUtil.login(10001) 進(jìn)行登錄授權(quán)時(shí),token的名稱將不再是 satoken,而是我們重寫后的 satoken-user。

八、不同體系不同 SaTokenConfig 配置

如果自定義的 StpUserUtil 需要使用不同 SaTokenConfig 對(duì)象, 也很簡(jiǎn)單,參考示例如下:

public class StpUserUtil {
	
	// 使用匿名子類 重寫`stpLogic對(duì)象`的一些方法 
	public static StpLogic stpLogic = new StpLogic("user") {
		
		// 首先自定義一個(gè) Config 對(duì)象 
		SaTokenConfig config = new SaTokenConfig()
			.setTokenName("satoken")
			.setTimeout(2592000)
			// ... 其它set
			;
		
		// 然后重寫 stpLogic 配置獲取方法 
		@Override
		public SaTokenConfig getConfig() {
			return config;
		}
	};
	
	// ... 
	
}

九、多賬號(hào)體系混合鑒權(quán)

QQ群中有小伙伴提問:在多賬號(hào)體系下,怎么在 SaInterceptor 攔截器中給一個(gè)接口登錄鑒權(quán)?

其實(shí)這個(gè)問題,主要是靠你的業(yè)務(wù)需求來決定,以后臺(tái) Admin 賬號(hào)和前臺(tái) User 賬號(hào)為例:文章來源地址http://www.zghlxwxcb.cn/news/detail-600118.html

// 注冊(cè) Sa-Token 攔截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
	registry.addInterceptor(new SaInterceptor(handle -> {
		
		// 如果這個(gè)接口,要求客戶端登錄了后臺(tái) Admin 賬號(hào)才能訪問:
		SaRouter.match("/art/getInfo").check(r -> StpUtil.checkLogin());

		// 如果這個(gè)接口,要求客戶端登錄了前臺(tái) User 賬號(hào)才能訪問:
		SaRouter.match("/art/getInfo").check(r -> StpUserUtil.checkLogin());
		
		// 如果這個(gè)接口,要求客戶端同時(shí)登錄 Admin 和 User 賬號(hào),才能訪問:
		SaRouter.match("/art/getInfo").check(r -> {
			StpUtil.checkLogin();
			StpUserUtil.checkLogin();
		});

		// 如果這個(gè)接口,要求客戶端登錄 Admin 和 User 賬號(hào)任意一個(gè),就能訪問:
		SaRouter.match("/art/getInfo").check(r -> {
			if(StpUtil.isLogin() == false && StpUserUtil.isLogin() == false) {
				throw new SaTokenException("請(qǐng)登錄后再訪問接口");
			}
		});
		
	})).addPathPatterns("/**");
}

參考資料

  • Sa-Token 文檔:https://sa-token.cc
  • Gitee 倉庫地址:https://gitee.com/dromara/sa-token
  • GitHub 倉庫地址:https://github.com/dromara/sa-token

到了這里,關(guān)于Sa-Token 多賬號(hào)認(rèn)證:同時(shí)為系統(tǒng)的 Admin 賬號(hào)和 User 賬號(hào)提供鑒權(quán)操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • springboot整合Sa-Token實(shí)現(xiàn)登錄認(rèn)證和權(quán)限校驗(yàn)(萬字長(zhǎng)文)

    springboot整合Sa-Token實(shí)現(xiàn)登錄認(rèn)證和權(quán)限校驗(yàn)(萬字長(zhǎng)文)

    目前在國(guó)內(nèi)的后端開發(fā)中,常用的安全框架有spring security、shiro。現(xiàn)在,介紹一款由國(guó)人開發(fā)的安全框架Sa-Token。這個(gè)框架完全由國(guó)人開發(fā),所提供的Api文檔和一些設(shè)置都是比較符合國(guó)人的開發(fā)習(xí)慣的,本次就來介紹一下如何在spring boot框架中整合Sa-Token框架,以實(shí)現(xiàn)我們最常

    2024年04月27日
    瀏覽(25)
  • 【Sa-Token】SpringBoot 整合 Sa-Token 快速實(shí)現(xiàn) API 接口簽名安全校驗(yàn)

    在涉及跨系統(tǒng)接口調(diào)用時(shí),我們?nèi)菀着龅揭韵掳踩珕栴}: 請(qǐng)求身份被偽造 請(qǐng)求參數(shù)被篡改 請(qǐng)求被抓包,然后重放攻擊 sa-token api-sign 模塊將幫你輕松解決以上難題。(此插件是內(nèi)嵌到 sa-token-core 核心包中的模塊,開發(fā)者無需再次引入其它依賴,插件直接可用) 假設(shè)我們有如

    2024年02月17日
    瀏覽(20)
  • Sa-Token淺談

    Sa-Token淺談

    主要介紹Sa-Token的鑒權(quán)使用以及實(shí)現(xiàn)原理。 官網(wǎng)介紹的非常詳細(xì),主要突出這是一個(gè)輕量級(jí)鑒權(quán)框架的特點(diǎn),詳情可自行訪問:https://sa-token.dev33.cn/doc.html#/ 旨在簡(jiǎn)單使用,大部分功能均可以在一行代碼內(nèi)實(shí)現(xiàn),這里舉幾個(gè)官網(wǎng)示例: 首先添加依賴: yaml配置文件: 功能圖如下

    2024年02月09日
    瀏覽(26)
  • Sa-Token組件介紹

    Sa-Token組件介紹

    個(gè)人博客:無奈何楊(wnhyang) 個(gè)人語雀:wnhyang 共享語雀:在線知識(shí)共享 Github:wnhyang - Overview 前文講了Sa-Token介紹與SpringBoot環(huán)境下使用,但是 satoken 最重要的登錄鑒權(quán)直接略過了,那這篇文章就開講,??當(dāng)然不是啦??礃?biāo)題就知道這次要講的是 satoken 組件,為什么這么安排

    2024年01月20日
    瀏覽(29)
  • Sa-Token源碼簡(jiǎn)單閱讀

    Sa-Token源碼簡(jiǎn)單閱讀

    一.權(quán)限登錄模塊包括幾個(gè)基本子模塊: 1.登錄。 實(shí)現(xiàn)方式大致為:先檢驗(yàn)用戶名密碼是否正確,如正確則在 緩存 中存入用戶信息(一般必須要有用戶標(biāo)識(shí)和訪問token,或再加一些附加信息如用戶的角色權(quán)限),再返回訪問token給客戶端。 2.過濾器,主要通過客戶端訪問時(shí)帶

    2023年04月26日
    瀏覽(24)
  • mall :sa-token項(xiàng)目源碼解析

    mall :sa-token項(xiàng)目源碼解析

    目錄 一、mall開源項(xiàng)目 1.1 來源 1.2 項(xiàng)目轉(zhuǎn)移 1.3 項(xiàng)目克隆 二、Sa-Toekn框架 2.1 Sa-Token 簡(jiǎn)介 2.2 分布式后端項(xiàng)目的使用流程 2.3 分布式后端項(xiàng)目的使用場(chǎng)景 三、源碼解析 3.1 集成與配置 3.1.1 導(dǎo)入依賴 3.1.2 添加配置 3.1.3 異常處理 3.1.4 存儲(chǔ)用戶信息 3.2 登錄認(rèn)證 3.2.1 配置黑白名單

    2024年02月12日
    瀏覽(18)
  • 一文詳解 Sa-Token 中的 SaSession 對(duì)象

    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)問題。 Gitee 開源地址:https://gitee.com/dromara/sa-token 本文將詳細(xì)介紹 Sa-Token 中的不同 SaSession 對(duì)象的區(qū)別,以及各種方便的存取值的方法。 Session 是會(huì)話

    2024年02月06日
    瀏覽(29)
  • 使用 Sa-Token 完成踢人下線功能

    在企業(yè)級(jí)項(xiàng)目中,踢人下線是一個(gè)很常見的需求,如果要設(shè)計(jì)比較完善的話,至少需要以下功能點(diǎn): 可以根據(jù)用戶 userId 踢出指定會(huì)話,對(duì)方再次訪問系統(tǒng)會(huì)被提示:您已被踢下線,請(qǐng)重新登錄。 可以查詢出一個(gè)賬號(hào)共在幾個(gè)設(shè)備端登錄,并返回其對(duì)應(yīng)的 Token 憑證,以便后

    2024年02月03日
    瀏覽(23)
  • SpringBoot 使用 Sa-Token 完成路由攔截鑒權(quán)

    在前文,我們?cè)敿?xì)的講述了在 Sa-Token 如何使用注解進(jìn)行權(quán)限認(rèn)證,注解鑒權(quán)雖然方便,卻并不適合所有鑒權(quán)場(chǎng)景。 假設(shè)有如下需求:項(xiàng)目中所有接口均需要登錄認(rèn)證校驗(yàn),只有 “登錄接口” 本身對(duì)外開放。 如果我們對(duì)項(xiàng)目所有接口都加上 @SaCheckLogin 注解,會(huì)顯得非常冗余

    2024年02月05日
    瀏覽(23)
  • SpringBoot 使用 Sa-Token 完成注解鑒權(quán)功能

    注解鑒權(quán) —— 優(yōu)雅的將鑒權(quán)與業(yè)務(wù)代碼分離。本篇我們將介紹在 Sa-Token 中如何通過注解完成權(quán)限校驗(yàn)。 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)問題。 Gitee 開源地址:https://gitee.com/dromar

    2024年02月04日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包