欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot使用Sa-Token實(shí)現(xiàn)賬號(hào)封禁、分類封禁、階梯封禁的示例代碼

 更新時(shí)間:2023年07月18日 08:35:52   作者:省長(zhǎng)  
本文主要介紹了SpringBoot使用Sa-Token實(shí)現(xiàn)賬號(hào)封禁、分類封禁、階梯封禁的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、需求分析

之前的章節(jié)中,我們學(xué)習(xí)了 踢人下線 和 強(qiáng)制注銷 功能,用于清退違規(guī)賬號(hào)。在部分場(chǎng)景下,我們還需要將其 賬號(hà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 開源地址:gitee.com/dromara/sa-token

Sa-Token 提供的封禁操作有三種:

  • 賬號(hào)封禁:封禁掉一個(gè)賬號(hào)的登錄能力,使其無法登錄。
  • 分類封禁:封禁掉一個(gè)賬號(hào)的部分業(yè)務(wù)操作權(quán)限,不影響賬號(hào)的整體登錄等基礎(chǔ)功能。
  • 階梯封禁:按照不同的違規(guī)程度,給與其不同的封禁力度。

本篇文章將介紹在 Sa-Token 中如何完成上述三種封禁操作。

首先在項(xiàng)目中引入 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 即可。

二、賬號(hào)封禁

對(duì)指定賬號(hào)進(jìn)行封禁:

// 封禁指定賬號(hào) 
StpUtil.disable(10001, 86400); 

參數(shù)含義:

  • 參數(shù)1:要封禁的賬號(hào)id。
  • 參數(shù)2:封禁時(shí)間,單位:秒,此為 86400秒 = 1天(此值為 -1 時(shí),代表永久封禁)。

注意點(diǎn):對(duì)于正在登錄的賬號(hào),將其封禁并不會(huì)使它立即掉線,如果我們需要它即刻下線,可采用先踢再封禁的策略,例如:

// 先踢下線
StpUtil.kickout(10001); 
// 再封禁賬號(hào)
StpUtil.disable(10001, 86400); 

待到下次登錄時(shí),我們先校驗(yàn)一下這個(gè)賬號(hào)是否已被封禁:

// 校驗(yàn)指定賬號(hào)是否已被封禁,如果被封禁則拋出異常 `DisableServiceException`
StpUtil.checkDisable(10001); 
// 通過校驗(yàn)后,再進(jìn)行登錄:
StpUtil.login(10001); 

舊版本在 StpUtil.login() 時(shí)會(huì)自動(dòng)校驗(yàn)賬號(hào)是否被封禁,v1.31.0 之后將 校驗(yàn)封禁 和 登錄 兩個(gè)動(dòng)作分離成兩個(gè)方法,不再自動(dòng)校驗(yàn),請(qǐng)注意其中的邏輯更改。

此模塊所有方法:

// 封禁指定賬號(hào) 
StpUtil.disable(10001, 86400); 
// 獲取指定賬號(hào)是否已被封禁 (true=已被封禁, false=未被封禁) 
StpUtil.isDisable(10001); 
// 校驗(yàn)指定賬號(hào)是否已被封禁,如果被封禁則拋出異常 `DisableServiceException`
StpUtil.checkDisable(10001); 
// 獲取指定賬號(hào)剩余封禁時(shí)間,單位:秒,如果該賬號(hào)未被封禁,則返回-2 
StpUtil.getDisableTime(10001); 
// 解除封禁
StpUtil.untieDisable(10001); 

三、分類封禁

有的時(shí)候,我們并不需要將整個(gè)賬號(hào)禁掉,而是只禁止其訪問部分服務(wù)。

假設(shè)我們?cè)陂_發(fā)一個(gè)電商系統(tǒng),對(duì)于違規(guī)賬號(hào)的處罰,我們?cè)O(shè)定三種分類封禁:

  • 1、封禁評(píng)價(jià)能力:賬號(hào)A 因?yàn)槎啻翁摷俸迷u(píng),被限制訂單評(píng)價(jià)功能。
  • 2、封禁下單能力:賬號(hào)B 因?yàn)槎啻无堆蛎幌拗葡聠喂δ堋?/li>
  • 3、封禁開店能力:賬號(hào)C 因?yàn)榈赇佷N售假貨,被限制開店功能。

相比于封禁賬號(hào)的一刀切處罰,這里的關(guān)鍵點(diǎn)在于:每一項(xiàng)能力封禁的同時(shí),都不會(huì)對(duì)其它能力造成影響。

也就是說我們需要一種只對(duì)部分服務(wù)進(jìn)行限制的能力,對(duì)應(yīng)到代碼層面,就是只禁止部分接口的調(diào)用。

// 封禁指定用戶評(píng)論能力,期限為 1天
StpUtil.disable(10001, "comment", 86400);

參數(shù)釋義:

  • 參數(shù)1:要封禁的賬號(hào)id。
  • 參數(shù)2:針對(duì)這個(gè)賬號(hào),要封禁的服務(wù)標(biāo)識(shí)(可以是任意的自定義字符串)。
  • 參數(shù)3:要封禁的時(shí)間,單位:秒,此為 86400秒 = 1天(此值為 -1 時(shí),代表永久封禁)。

分類封禁模塊所有可用API:

/*
 * 以下示例中:"comment"=評(píng)論服務(wù)標(biāo)識(shí)、"place-order"=下單服務(wù)標(biāo)識(shí)、"open-shop"=開店服務(wù)標(biāo)識(shí)
 */
// 封禁指定用戶評(píng)論能力,期限為 1天
StpUtil.disable(10001, "comment", 86400);
// 在評(píng)論接口,校驗(yàn)一下,會(huì)拋出異常:`DisableServiceException`,使用 e.getService() 可獲取業(yè)務(wù)標(biāo)識(shí) `comment` 
StpUtil.checkDisable(10001, "comment");
// 在下單時(shí),我們校驗(yàn)一下 下單能力,并不會(huì)拋出異常,因?yàn)槲覀儧]有限制其下單功能
StpUtil.checkDisable(10001, "place-order");
// 現(xiàn)在我們?cè)賹⑵湎聠文芰Ψ饨幌?,期限?7天 
StpUtil.disable(10001, "place-order", 86400 * 7);
// 然后在下單接口,我們添加上校驗(yàn)代碼,此時(shí)用戶便會(huì)因?yàn)橄聠文芰Ρ环饨鵁o法下單(代碼拋出異常)
StpUtil.checkDisable(10001, "place-order");
// 但是此時(shí),用戶如果調(diào)用開店功能的話,還是可以通過,因?yàn)槲覀儧]有限制其開店能力 (除非我們?cè)僬{(diào)用了封禁開店的代碼)
StpUtil.checkDisable(10001, "open-shop");

通過以上示例,你應(yīng)該大致可以理解 業(yè)務(wù)封禁 -> 業(yè)務(wù)校驗(yàn) 的處理步驟。

有關(guān)分類封禁的所有方法:

// 封禁:指定賬號(hào)的指定服務(wù) 
StpUtil.disable(10001, "<業(yè)務(wù)標(biāo)識(shí)>", 86400); 
// 判斷:指定賬號(hào)的指定服務(wù) 是否已被封禁 (true=已被封禁, false=未被封禁) 
StpUtil.isDisable(10001, "<業(yè)務(wù)標(biāo)識(shí)>"); 
// 校驗(yàn):指定賬號(hào)的指定服務(wù) 是否已被封禁,如果被封禁則拋出異常 `DisableServiceException`
StpUtil.checkDisable(10001, "<業(yè)務(wù)標(biāo)識(shí)>"); 
// 獲取:指定賬號(hào)的指定服務(wù) 剩余封禁時(shí)間,單位:秒(-1=永久封禁,-2=未被封禁)
StpUtil.getDisableTime(10001, "<業(yè)務(wù)標(biāo)識(shí)>"); 
// 解封:指定賬號(hào)的指定服務(wù)
StpUtil.untieDisable(10001, "<業(yè)務(wù)標(biāo)識(shí)>"); 

四、階梯封禁

對(duì)于多次違規(guī)的用戶,我們常常采取階梯處罰的策略,這種 “階梯” 一般有兩種形式:

  • 處罰時(shí)間階梯:首次違規(guī)封禁 1 天,第二次封禁 7 天,第三次封禁 30 天,依次順延……
  • 處罰力度階梯:首次違規(guī)消息提醒、第二次禁言禁評(píng)論、第三次禁止賬號(hào)登錄,等等……

基于處罰時(shí)間的階梯,我們只需在封禁時(shí) StpUtil.disable(10001, 86400) 傳入不同的封禁時(shí)間即可,下面我們著重探討一下基于處罰力度的階梯形式。

假設(shè)我們?cè)陂_發(fā)一個(gè)論壇系統(tǒng),對(duì)于違規(guī)賬號(hào)的處罰,我們?cè)O(shè)定三種力度:

  • 1、輕度違規(guī):封禁其發(fā)帖、評(píng)論能力,但允許其點(diǎn)贊、關(guān)注等操作。
  • 2、中度違規(guī):封禁其發(fā)帖、評(píng)論、點(diǎn)贊、關(guān)注等一切與別人互動(dòng)的能力,但允許其瀏覽帖子、瀏覽評(píng)論。
  • 3、重度違規(guī):封禁其登錄功能,限制一切能力。

解決這種需求的關(guān)鍵在于,我們需要把不同處罰力度,量化成不同的處罰等級(jí),比如上述的 輕度、中度、重度 3 個(gè)力度, 我們將其量化為一級(jí)封禁二級(jí)封禁、三級(jí)封禁 3個(gè)等級(jí),數(shù)字越大代表封禁力度越高。

然后我們就可以使用階梯封禁的API,進(jìn)行鑒權(quán)了:

// 階梯封禁,參數(shù):封禁賬號(hào)、封禁級(jí)別、封禁時(shí)間 
StpUtil.disableLevel(10001, 3, 10000);
// 獲?。褐付ㄙ~號(hào)封禁的級(jí)別 (如果此賬號(hào)未被封禁則返回 -2)
StpUtil.getDisableLevel(10001);
// 判斷:指定賬號(hào)是否已被封禁到指定級(jí)別,返回 true 或 false
StpUtil.isDisableLevel(10001, 3);
// 校驗(yàn):指定賬號(hào)是否已被封禁到指定級(jí)別,如果已達(dá)到此級(jí)別(例如已被3級(jí)封禁,這里校驗(yàn)是否達(dá)到2級(jí)),則拋出異常 `DisableServiceException`
StpUtil.checkDisableLevel(10001, 2);

注意點(diǎn):DisableServiceException 異常代表當(dāng)前賬號(hào)未通過封禁校驗(yàn),可以:

  • 通過 e.getLevel() 獲取這個(gè)賬號(hào)實(shí)際被封禁的等級(jí)。
  • 通過 e.getLimitLevel() 獲取這個(gè)賬號(hào)在校驗(yàn)時(shí)要求低于的等級(jí)。當(dāng) Level >= LimitLevel 時(shí),框架就會(huì)拋出異常。

如果業(yè)務(wù)足夠復(fù)雜,我們還可能將 分類封禁 和 階梯封禁 組合使用:

// 分類階梯封禁,參數(shù):封禁賬號(hào)、封禁服務(wù)、封禁級(jí)別、封禁時(shí)間 
StpUtil.disableLevel(10001, "comment", 3, 10000);
// 獲?。褐付ㄙ~號(hào)的指定服務(wù) 封禁的級(jí)別 (如果此賬號(hào)未被封禁則返回 -2)
StpUtil.getDisableLevel(10001, "comment");
// 判斷:指定賬號(hào)的指定服務(wù) 是否已被封禁到指定級(jí)別,返回 true 或 false
StpUtil.isDisableLevel(10001, "comment", 3);
// 校驗(yàn):指定賬號(hào)的指定服務(wù) 是否已被封禁到指定級(jí)別(例如 comment服務(wù) 已被3級(jí)封禁,這里校驗(yàn)是否達(dá)到2級(jí)),如果已達(dá)到此級(jí)別,則拋出異常 
StpUtil.checkDisableLevel(10001, "comment", 2);

五、使用注解完成封禁校驗(yàn)

首先我們需要注冊(cè) Sa-Token 全局?jǐn)r截器:

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
	// 注冊(cè) Sa-Token 攔截器,打開注解式鑒權(quán)功能 
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");	
	}
}

然后我們就可以使用以下注解校驗(yàn)賬號(hào)是否封禁:

// 校驗(yàn)當(dāng)前賬號(hào)是否被封禁,如果已被封禁會(huì)拋出異常,無法進(jìn)入方法 
@SaCheckDisable
@PostMapping("send")
public SaResult send() {
	// ... 
	return SaResult.ok(); 
}
// 校驗(yàn)當(dāng)前賬號(hào)是否被封禁 comment 服務(wù),如果已被封禁會(huì)拋出異常,無法進(jìn)入方法 
@SaCheckDisable("comment")
@PostMapping("send")
public SaResult send() {
	// ... 
	return SaResult.ok(); 
}
// 校驗(yàn)當(dāng)前賬號(hào)是否被封禁 comment、place-order、open-shop 等服務(wù),指定多個(gè)值,只要有一個(gè)已被封禁,就無法進(jìn)入方法 
@SaCheckDisable({"comment", "place-order", "open-shop"})
@PostMapping("send")
public SaResult send() {
	// ... 
	return SaResult.ok(); 
}
// 階梯封禁,校驗(yàn)當(dāng)前賬號(hào)封禁等級(jí)是否達(dá)到5級(jí),如果達(dá)到則拋出異常 
@SaCheckDisable(level = 5)
@PostMapping("send")
public SaResult send() {
	// ... 
	return SaResult.ok(); 
}
// 分類封禁 + 階梯封禁 校驗(yàn):校驗(yàn)當(dāng)前賬號(hào)的 comment 服務(wù),封禁等級(jí)是否達(dá)到5級(jí),如果達(dá)到則拋出異常 
@SaCheckDisable(value = "comment", level = 5)
@PostMapping("send")
public SaResult send() {
	// ... 
	return SaResult.ok(); 
}

六、來個(gè)小示例,加深理解

package com.pj.cases.up;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
/**
 * Sa-Token 賬號(hào)封禁示例 
 * 
 * @author kong
 * @since 2022-10-17 
 */
@RestController
@RequestMapping("/disable/")
public class DisableController {
	// 會(huì)話登錄接口  ---- http://localhost:8081/disable/login?userId=10001
	@RequestMapping("login")
	public SaResult login(long userId) {
		// 1、先檢查此賬號(hào)是否已被封禁 
		StpUtil.checkDisable(userId);
		// 2、檢查通過后,再登錄 
		StpUtil.login(userId);
		return SaResult.ok("賬號(hào)登錄成功");
	}
	// 會(huì)話注銷接口  ---- http://localhost:8081/disable/logout
	@RequestMapping("logout")
	public SaResult logout() {
		StpUtil.logout();
		return SaResult.ok("賬號(hào)退出成功");
	}
	// 封禁指定賬號(hào)  ---- http://localhost:8081/disable/disable?userId=10001
	@RequestMapping("disable")
	public SaResult disable(long userId) {
		/*
		 * 賬號(hào)封禁:
		 * 	參數(shù)1:要封禁的賬號(hào)id
		 * 	參數(shù)2:要封禁的時(shí)間,單位:秒,86400秒=1天
		 */
		StpUtil.disable(userId, 86400);
		return SaResult.ok("賬號(hào) " + userId + " 封禁成功");
	}
	// 解封指定賬號(hào)  ---- http://localhost:8081/disable/untieDisable?userId=10001
	@RequestMapping("untieDisable")
	public SaResult untieDisable(long userId) {
		StpUtil.untieDisable(userId);
		return SaResult.ok("賬號(hào) " + userId + " 解封成功");
	}
}

測(cè)試步驟:

  • 訪問登錄接口,可以正常登錄 ---- http://localhost:8081/disable/login?userId=10001
  • 注銷登錄 ---- http://localhost:8081/disable/logout
  • 禁用賬號(hào) ---- http://localhost:8081/disable/disable?userId=10001
  • 再次訪問登錄接口,登錄失敗 ---- http://localhost:8081/disable/login?userId=10001
  • 解封賬號(hào) ---- http://localhost:8081/disable/untieDisable?userId=10001
  • 再次訪問登錄接口,登錄成功 ---- http://localhost:8081/disable/login?userId=10001

參考資料

到此這篇關(guān)于SpringBoot使用Sa-Token實(shí)現(xiàn)賬號(hào)封禁、分類封禁、階梯封禁的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot賬號(hào)封禁、分類封禁、階梯封禁內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java匿名內(nèi)部類實(shí)例代碼詳解

    java匿名內(nèi)部類實(shí)例代碼詳解

    這篇文章主要介紹了java匿名內(nèi)部類實(shí)例代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 關(guān)于IntelliJ IDEA 打包代碼報(bào)錯(cuò)的問題

    關(guān)于IntelliJ IDEA 打包代碼報(bào)錯(cuò)的問題

    這篇文章主要介紹了關(guān)于IntelliJ IDEA 打包代碼報(bào)錯(cuò)的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • IDEA2021.2永久激活碼最新超詳細(xì)(激活到2099)

    IDEA2021.2永久激活碼最新超詳細(xì)(激活到2099)

    這篇文章主要介紹了IDEA2021.2永久激活碼,是idea2021版最新激活方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • spring boot如何使用AOP統(tǒng)一處理web請(qǐng)求

    spring boot如何使用AOP統(tǒng)一處理web請(qǐng)求

    這篇文章主要介紹了spring boot如何使用AOP統(tǒng)一處理web請(qǐng)求,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java中synchronized的幾種使用方法

    Java中synchronized的幾種使用方法

    本文主要介紹了Java中synchronized的幾種使用方法,synchronized可用于修飾普通方法、靜態(tài)方法和代碼塊,下面詳細(xì)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • Spring boot Rabbitmq消息防丟失實(shí)踐

    Spring boot Rabbitmq消息防丟失實(shí)踐

    這篇文章主要介紹了Spring boot Rabbitmq消息防丟失實(shí)踐,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 使用springmvc配置視圖解析器和重定向方式

    使用springmvc配置視圖解析器和重定向方式

    這篇文章主要介紹了使用springmvc配置視圖解析器和重定向方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringCloud實(shí)現(xiàn)Redis在各個(gè)微服務(wù)的Session共享問題

    SpringCloud實(shí)現(xiàn)Redis在各個(gè)微服務(wù)的Session共享問題

    Redis是運(yùn)行在內(nèi)存中,查取速度很快。本文重點(diǎn)給大家介紹SpringCloud實(shí)現(xiàn)Redis在各個(gè)微服務(wù)的Session共享,感興趣的朋友一起看看吧
    2018-08-08
  • 深入了解Java8中的時(shí)區(qū)日期時(shí)間

    深入了解Java8中的時(shí)區(qū)日期時(shí)間

    Java?在?java.time?包中也提供了幾個(gè)類用于處理需要關(guān)注時(shí)區(qū)的日期時(shí)間?API,本文將通過簡(jiǎn)單的示例講講它們的用法,需要的可以參考一下
    2023-04-04
  • SpringBoot攔截器的配置使用介紹

    SpringBoot攔截器的配置使用介紹

    攔截器可以用來實(shí)現(xiàn)未滿足某些條件,不容許訪問某些資源。SpringBoot 支持?jǐn)r截器,本文主要介紹攔截器的使用與原理
    2022-10-10

最新評(píng)論