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

Sa-Token淺談

這篇具有很好參考價(jià)值的文章主要介紹了Sa-Token淺談。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

主要介紹Sa-Token的鑒權(quán)使用以及實(shí)現(xiàn)原理。

簡介

官網(wǎng)介紹的非常詳細(xì),主要突出這是一個(gè)輕量級(jí)鑒權(quán)框架的特點(diǎn),詳情可自行訪問:https://sa-token.dev33.cn/doc.html#/

Sa-Token淺談

使用

旨在簡單使用,大部分功能均可以在一行代碼內(nèi)實(shí)現(xiàn),這里舉幾個(gè)官網(wǎng)示例:

首先添加依賴:

<!-- Sa-Token 權(quán)限認(rèn)證,在線文檔:https://sa-token.cc -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.33.0</version>
</dependency>

yaml配置文件:

server:
    # 端口
    port: 8081

############## Sa-Token 配置 (文檔: https://sa-token.cc) ##############
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
// 會(huì)話登錄,參數(shù)填登錄人的賬號(hào)id 
StpUtil.login(10001);
// 校驗(yàn)當(dāng)前客戶端是否已經(jīng)登錄,如果未登錄則拋出 `NotLoginException` 異常
StpUtil.checkLogin();
// 將賬號(hào)id為 10077 的會(huì)話踢下線 
StpUtil.kickout(10077);

功能圖如下所示:

Sa-Token淺談

源碼解釋

解釋登錄原理

StpUtil.login(usId);

這短短的一句話代碼蘊(yùn)藏了多少玄機(jī),我們一探究竟。

首先我們觀察現(xiàn)象,模擬一個(gè)登錄入口/login,里面做一個(gè)最簡單的動(dòng)作,就是將前端傳入的usId作為用戶id并交給StpUtil執(zhí)行登錄邏輯,并最終將usId返回。

@GetMapping("/login")
private String login(String usId){
    StpUtil.login(usId);
    return usId;
}

訪問 http://localhost:8081/login?usId=123,成功返回結(jié)果123。

隨后我們F12查看瀏覽器的控制臺(tái),Application->打開Cookies:

Sa-Token淺談

能夠觀察到Cookies自動(dòng)新增了一個(gè)鍵為satoken的cookie鍵值對(duì),值類似于uuid隨機(jī)字符串,此處示例為9ea38efb-228f-4131-b844-903467caf205,過期時(shí)間設(shè)置了30天,可對(duì)應(yīng)前面配置文件的配置信息,satoken的cookie名稱以及過期時(shí)間均支持配置調(diào)整。


接下來我們分析源碼:

首先通過StpUtil作為入口,實(shí)際上通過實(shí)例化StpLogic來進(jìn)行調(diào)用:

// StpUtil.java
public static StpLogic stpLogic = new StpLogic("login");

public static void login(Object id) {
    stpLogic.login(id);
}

隨后在StpLogic中,通過傳入的Object id以及SaLoginModel進(jìn)行構(gòu)建會(huì)話:

// StpLogic.java
public void login(Object id) {
    this.login(id, new SaLoginModel());
}

// 通過這兩個(gè)方法進(jìn)行會(huì)話建立 createLoginSession()/setTokenValue()
public void login(Object id, SaLoginModel loginModel) {
    // 1、創(chuàng)建會(huì)話 
    String token = this.createLoginSession(id, loginModel);
    // 2、在當(dāng)前客戶端注入Token 
    setTokenValue(token, loginModel);
}

創(chuàng)建會(huì)話

分析StpLogic.createLoginSession()方法

public String createLoginSession(Object id, SaLoginModel loginModel) {
    // 1.這個(gè)設(shè)計(jì)可以借鑒一下,直接可以判斷id值為null就拋異常,將異常封裝起來
    SaTokenException.throwByNull(id, "賬號(hào)id不能為空", 11002);
    // 2.獲取配置信息
    SaTokenConfig config = this.getConfig();
    loginModel.build(config);
    // 3.生成token(若已經(jīng)有存在生效的token則使用原先的token)
    String tokenValue = this.distUsableToken(id, loginModel);
    // 4.獲取 User-Session/首次登錄則創(chuàng)建會(huì)話,使用自定義封裝的SaSession對(duì)象接收
    SaSession session = this.getSessionByLoginId(id, true);
    session.updateMinTimeout(loginModel.getTimeout());
    session.addTokenSign(tokenValue, loginModel.getDeviceOrDefault());
    // 5.設(shè)置token -> id 映射關(guān)系  
    this.saveTokenToIdMapping(tokenValue, id, loginModel.getTimeout());
    // 調(diào)用getSaTokenDao().set設(shè)置tokenValue與失效時(shí)間的關(guān)系
    this.setLastActivityToNow(tokenValue);
    // 6.事件發(fā)布
    SaTokenEventCenter.doLogin(this.loginType, id, tokenValue, loginModel);
    // 7.檢查此賬號(hào)會(huì)話數(shù)量是否超出最大值,-1表示不限會(huì)話數(shù)量
    if (config.getMaxLoginCount() != -1) {
        logoutByMaxLoginCount(id, session, (String)null, config.getMaxLoginCount());
    }

    return tokenValue;
}

1.前置檢查

判斷Object id是否為null

 SaTokenException.throwByNull(id, "賬號(hào)id不能為空", 11002);

public static void throwByNull(Object value, String message, int code) {
    if(SaFoxUtil.isEmpty(value)) {
        throw new SaTokenException(message).setCode(code);
    }
}

2.獲取配置

StpLogic.getConfig():

// 2.獲取配置信息
SaTokenConfig config = this.getConfig();

Sa-Token淺談

3.分配token

StpLogic.distUsableToken():

protected String distUsableToken(Object id, SaLoginModel loginModel) {
    Boolean isConcurrent = this.getConfig().getIsConcurrent();
    if (!isConcurrent) {
        this.replaced(id, loginModel.getDevice());
    }

    if (SaFoxUtil.isNotEmpty(loginModel.getToken())) {
        return loginModel.getToken();
    } else {
        if (isConcurrent && this.getConfigOfIsShare() && !loginModel.isSetExtraData()) {
            // 獲取token
            String tokenValue = this.getTokenValueByLoginId(id, loginModel.getDeviceOrDefault());
            // 已經(jīng)存在會(huì)話,將之前生成的token返回
            if (SaFoxUtil.isNotEmpty(tokenValue)) {
                return tokenValue;
            }
        }
		// *新會(huì)話,生成一個(gè)新token,可借鑒,見下方解析
        return this.createTokenValue(id, loginModel.getDeviceOrDefault(), loginModel.getTimeout(), loginModel.getExtraData());
    }
}

解析StpLogic.createTokenValue():

public class StpLogic {
    // ...
    
    public String createTokenValue(Object loginId, String device, long timeout, Map<String, Object> extraData) {
        // SaStrategy.me:使用SaStrategy的單例引用
        // SaStrategy.me.createToken:調(diào)用createToken()方法
        // SaStrategy.me.createToken.apply:使得結(jié)果生效
        return SaStrategy.me.createToken.apply(loginId, loginType);
    }
}


public final class SaStrategy {
    public static final SaStrategy me = new SaStrategy();
    
    public BiFunction<Object, String, String> createToken = (loginId, loginType) -> {
		// 根據(jù)配置的tokenStyle生成不同風(fēng)格的token 
		String tokenStyle = SaManager.getConfig().getTokenStyle();
		// uuid 
		if(SaTokenConsts.TOKEN_STYLE_UUID.equals(tokenStyle)) {
			return UUID.randomUUID().toString();
		}
		// 簡單uuid (不帶下劃線)
		if(SaTokenConsts.TOKEN_STYLE_SIMPLE_UUID.equals(tokenStyle)) {
			return UUID.randomUUID().toString().replaceAll("-", "");
		}
		// 32位隨機(jī)字符串
		if(SaTokenConsts.TOKEN_STYLE_RANDOM_32.equals(tokenStyle)) {
			return SaFoxUtil.getRandomString(32);
		}
		// 64位隨機(jī)字符串
		if(SaTokenConsts.TOKEN_STYLE_RANDOM_64.equals(tokenStyle)) {
			return SaFoxUtil.getRandomString(64);
		}
		// 128位隨機(jī)字符串
		if(SaTokenConsts.TOKEN_STYLE_RANDOM_128.equals(tokenStyle)) {
			return SaFoxUtil.getRandomString(128);
		}
		// tik風(fēng)格 (2_14_16)
		if(SaTokenConsts.TOKEN_STYLE_TIK.equals(tokenStyle)) {
			return SaFoxUtil.getRandomString(2) + "_" + SaFoxUtil.getRandomString(14) + "_" + SaFoxUtil.getRandomString(16) + "__";
		}
		// 默認(rèn),還是uuid 
		return UUID.randomUUID().toString();
	};
    
}

4.獲取 User-Session

StpLogic.getSessionByLoginId()

public SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
    return getSessionBySessionId(splicingKeySession(loginId), isCreate);
}

/** 
* 獲取指定key的Session, 如果Session尚未創(chuàng)建,isCreate=是否新建并返回
* @param sessionId SessionId
* @param isCreate 是否新建
* @return Session對(duì)象 
*/
public SaSession getSessionBySessionId(String sessionId, boolean isCreate) {
    // getSaTokenDao使用了懶加載初始化SaTokenDao對(duì)象,最終由new SaTokenDaoDefaultImpl()進(jìn)行實(shí)現(xiàn)具體方法
    // 并根據(jù)sessionId獲取session
    SaSession session = getSaTokenDao().getSession(sessionId);
    // session暫未建立,進(jìn)行session新建
    if(session == null && isCreate) {
        // 與上方的createToken使用了同樣的設(shè)計(jì)
        session = SaStrategy.me.createSession.apply(sessionId);
        // 設(shè)置session與session過期時(shí)效
        getSaTokenDao().setSession(session, getConfig().getTimeout());
    }
    return session;
}

5.設(shè)置token-id映射關(guān)系

StpLogic.saveTokenToIdMapping()

public void saveTokenToIdMapping(String tokenValue, Object loginId, long timeout) {
	// 如果繼續(xù)往下深挖其實(shí)set方法的實(shí)現(xiàn)底層就是一個(gè)new ConcurrentHashMap<String, Object>()
    // 并且封裝了一個(gè)new ConcurrentHashMap<String, Long>()來記錄key與過期時(shí)間的關(guān)系
    // 并且設(shè)置的過期過期時(shí)間
    getSaTokenDao().set(splicingKeyTokenValue(tokenValue), String.valueOf(loginId), timeout);
}

這里淺淺看一下設(shè)置的過期時(shí)間如何實(shí)現(xiàn):

/**
* 數(shù)據(jù)集合 
*/
public Map<String, Object> dataMap = new ConcurrentHashMap<String, Object>();

/**
* 過期時(shí)間集合 (單位: 毫秒) , 記錄所有key的到期時(shí)間 [注意不是剩余存活時(shí)間] 
*/
public Map<String, Long> expireMap = new ConcurrentHashMap<String, Long>();

@Override
public void set(String key, String value, long timeout) {
    if(timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE)  {
        return;
    }
    // 設(shè)置key-value
    dataMap.put(key, value);
    // 設(shè)置key-到期時(shí)間
    expireMap.put(key, (timeout == SaTokenDao.NEVER_EXPIRE) ? (SaTokenDao.NEVER_EXPIRE) : (System.currentTimeMillis() + timeout * 1000));
}

/**
* 如果指定key已經(jīng)過期,則立即清除它。在每個(gè)get方法前都首先調(diào)用一下這個(gè)方法
* @param key 指定key 
*/
void clearKeyByTimeout(String key) {
    Long expirationTime = expireMap.get(key);
    // 清除條件:如果不為空 && 不是[永不過期] && 已經(jīng)超過過期時(shí)間 
    if(expirationTime != null && expirationTime != SaTokenDao.NEVER_EXPIRE && expirationTime < System.currentTimeMillis()) {
        dataMap.remove(key);
        expireMap.remove(key);
    }
}

// ------------------------ String 讀寫操作 

@Override
public String get(String key) {
    // 首先判斷一下key是否已經(jīng)過期
    clearKeyByTimeout(key);
    return (String)dataMap.get(key);
}

6.登錄成功事件發(fā)布

SaTokenEventCenter.doLogin

// --------- 注冊(cè)偵聽器 
private static List<SaTokenListener> listenerList = new ArrayList<>();

/**
* 每次登錄時(shí)觸發(fā) 
* @param loginType 賬號(hào)類別
* @param loginId 賬號(hào)id
* @param tokenValue 本次登錄產(chǎn)生的 token 值 
* @param loginModel 登錄參數(shù)
*/
public static void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) {
    for (SaTokenListener listener : listenerList) {
        listener.doLogin(loginType, loginId, tokenValue, loginModel);
    }
}

主要目的是登錄成功后的一些后置處理方法回調(diào)等,通過觀察我們可以發(fā)現(xiàn)只要注冊(cè)到SaTokenEventCenter.listenerList中即可在遍歷中執(zhí)行監(jiān)聽器的doLogin()方法。目前默認(rèn)添加控制臺(tái)日志偵聽器,new SaTokenListenerForLog(),主要實(shí)現(xiàn)一些日志打?。?/p>

Sa-Token淺談

還有一個(gè)空實(shí)現(xiàn)的SaTokenListenerForSimple監(jiān)聽器,后續(xù)我們?nèi)绻胍鲆恍┳远x擴(kuò)展,就可以繼承SaTokenListenerForSimple做一些屬于我們自己的業(yè)務(wù)監(jiān)聽器處理:

Sa-Token淺談

7.檢查會(huì)話數(shù)量

StpLogic.logoutByMaxLoginCount()

/**
* 會(huì)話注銷,根據(jù)賬號(hào)id 和 設(shè)備類型 和 最大同時(shí)在線數(shù)量 
* 
* @param loginId 賬號(hào)id 
* @param session 此賬號(hào)的 Session 對(duì)象,可填寫null,框架將自動(dòng)獲取 
* @param device 設(shè)備類型 (填null代表注銷所有設(shè)備類型) 
* @param maxLoginCount 保留最近的幾次登錄 
*/
public void logoutByMaxLoginCount(Object loginId, SaSession session, String device, int maxLoginCount) {
    if(session == null) {
        session = getSessionByLoginId(loginId, false);
        if(session == null) {
            return;
        }
    }
    List<TokenSign> list = session.tokenSignListCopyByDevice(device);
    // 遍歷操作 
    for (int i = 0; i < list.size(); i++) {
        // 只操作前n條 
        if(i >= list.size() - maxLoginCount) {
            continue;
        }
        // 清理: token簽名、token最后活躍時(shí)間 
        String tokenValue = list.get(i).getValue();
        session.removeTokenSign(tokenValue); 
        clearLastActivity(tokenValue); 	
        // 刪除Token-Id映射 & 清除Token-Session 
        deleteTokenToIdMapping(tokenValue);
        deleteTokenSession(tokenValue);
        // $$ 發(fā)布事件:指定賬號(hào)注銷 
        SaTokenEventCenter.doLogout(loginType, loginId, tokenValue);
    }
    // 注銷 Session 
    session.logoutByTokenSignCountToZero();
}

客戶端注入Token

分析StpLogic.setTokenValue()方法

/**
* 在當(dāng)前會(huì)話寫入當(dāng)前TokenValue 
* @param tokenValue token值 
* @param loginModel 登錄參數(shù) 
*/
public void setTokenValue(String tokenValue, SaLoginModel loginModel){

    if(SaFoxUtil.isEmpty(tokenValue)) {
        return;
    }

    // 1. 將 Token 保存到 [存儲(chǔ)器] 里  
    setTokenValueToStorage(tokenValue);

    // 2. 將 Token 保存到 [Cookie] 里 此處對(duì)應(yīng)
    if (getConfig().getIsReadCookie()) {
        setTokenValueToCookie(tokenValue, loginModel.getCookieTimeout());
    }

    // 3. 將 Token 寫入到響應(yīng)頭里 
    if(loginModel.getIsWriteHeaderOrGlobalConfig()) {
        setTokenValueToResponseHeader(tokenValue);
    }
}

參考資料:文章來源地址http://www.zghlxwxcb.cn/news/detail-484784.html

  • Sa-Token官網(wǎng)介紹
  • sa-token使用(源碼解析 + 萬字)

到了這里,關(guān)于Sa-Token淺談的文章就介紹完了。如果您還想了解更多內(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)文章

  • Sa-Token 多賬號(hào)認(rèn)證:同時(shí)為系統(tǒng)的 Admin 賬號(hào)和 User 賬號(hào)提供鑒權(quá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/dromara/sa-token 本篇將介紹 Sa-Token 中的多賬號(hào)認(rèn)證操作。 有的時(shí)候,我們會(huì)在一個(gè)項(xiàng)目中設(shè)計(jì)兩套賬號(hào)體系,比如

    2024年02月16日
    瀏覽(17)
  • 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)
  • SpringBoot 使用 Sa-Token 完成權(quán)限認(rèn)證

    所謂權(quán)限認(rèn)證,核心邏輯就是判斷一個(gè)賬號(hào)是否擁有指定權(quán)限: 有,就讓你通過。 沒有?那么禁止訪問! 深入到底層數(shù)據(jù)中,就是每個(gè)賬號(hào)都會(huì)擁有一個(gè)權(quán)限碼集合,框架來校驗(yàn)這個(gè)集合中是否包含指定的權(quán)限碼。 例如:當(dāng)前賬號(hào)擁有權(quán)限碼集合 [\\\"user-add\\\", \\\"user-delete\\\", \\\"us

    2023年04月25日
    瀏覽(21)
  • 使用 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)
  • Sa-Token v.1.31.0 新增攔截器 SaInterceptor 功能說明,以及舊代碼遷移示例

    前言 如果你的項(xiàng)目沒有使用舊寫法,可以忽略本篇文章 移步官網(wǎng),本文只針對(duì)舊版本到新版本的遷移提供示例。 1、舊版本 Sa-Token 在 1.30.0 及以下版本中使用兩個(gè)攔截器: SaAnnotationInterceptor :負(fù)責(zé)提供注解鑒權(quán)能力。 SaRouteInterceptor :負(fù)責(zé)提供路由攔截鑒權(quán)能力。 這次新增

    2024年02月07日
    瀏覽(130)
  • 前后端分離架構(gòu)下使用 Sa-Token 完成登錄認(rèn)證

    目前絕大多數(shù)系統(tǒng)都已經(jīng)采用 “前后端分離” 架構(gòu)來設(shè)計(jì)了,傳統(tǒng)的Session模式鑒權(quán)也不再適合這種架構(gòu)(或者需要額外寫很多的代碼來專門適配)。 Sa-Token 是一個(gè) java 輕量級(jí)權(quán)限認(rèn)證框架,專為前后端分離架構(gòu)打造,主要解決登錄認(rèn)證、權(quán)限認(rèn)證、單點(diǎn)登錄、OAuth2、微服務(wù)

    2024年02月07日
    瀏覽(76)
  • 使用 Sa-Token 實(shí)現(xiàn) [記住我] 模式登錄、七天免登錄

    如圖所示,一般網(wǎng)站的登錄界面都會(huì)有一個(gè) [記住我] 按鈕,當(dāng)你勾選它登錄后,即使你關(guān)閉瀏覽器再次打開網(wǎng)站,也依然會(huì)處于登錄狀態(tài),無須重復(fù)驗(yàn)證密碼: 本文將詳細(xì)介紹在 Sa-Token中,如何做到以下登錄模式: 記住我登錄:登錄后關(guān)閉瀏覽器,再次打開網(wǎng)站登錄狀態(tài)依

    2024年02月09日
    瀏覽(20)
  • 【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 實(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è)輕量

    2024年02月13日
    瀏覽(16)
  • Sa-Token源碼簡單閱讀

    Sa-Token源碼簡單閱讀

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

    2023年04月26日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包