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

Sa-Token組件介紹

這篇具有很好參考價值的文章主要介紹了Sa-Token組件介紹。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

個人博客:無奈何楊(wnhyang)

個人語雀:wnhyang

共享語雀:在線知識共享

Github:wnhyang - Overview


前文講了Sa-Token介紹與SpringBoot環(huán)境下使用,但是satoken最重要的登錄鑒權(quán)直接略過了,那這篇文章就開講,??當(dāng)然不是啦??礃?biāo)題就知道這次要講的是satoken組件,為什么這么安排呢,是因為我在細(xì)致了解satoken源碼后,還是非常想把satoken講的比較清楚細(xì)致的,包含其中一些設(shè)計模式的使用、函數(shù)式接口的應(yīng)用、組件注冊的方法等,而要講好這些,satoken的組件一定要講一下吧,廢話不多說了,下面開始。

必要聲明:文章基于Sa-Token,版本1.37.0

satoken項目結(jié)構(gòu)

下載源碼

git clone https://github.com/dromara/Sa-Token.git

項目結(jié)構(gòu)介紹

項目結(jié)構(gòu)組織如下,結(jié)構(gòu)還是相當(dāng)清晰明了的。我也不可能把所有工程代碼詳細(xì)都講一下,只能根據(jù)satoken最重要的模塊挑一部分細(xì)致講一下。

Sa-Token組件介紹

satoken核心

簡單介紹一下satoken的項目結(jié)構(gòu),就可以步入本篇文章的正題了——satoken組件。

sa-token-core的組織結(jié)構(gòu)如下,包的命名已經(jīng)能說明一些什么了,接下來到了哪塊就細(xì)致來說哪塊。

Sa-Token組件介紹

SaManager

全類名路徑:cn.dev33.satoken.SaManager

以上結(jié)構(gòu)中最突出的就是SaManager了,官方給他的定義如下,可見其重要性。

/**
 * 管理 Sa-Token 所有全局組件,可通過此類快速獲取、寫入各種全局組件對象
 *
 * @author click33
 * @since 1.18.0
 */
public class SaManager {
    ...
}

SaManager的結(jié)構(gòu)如下,其中這些屬性就是satoken最重要的組件了,下面挑出幾個細(xì)講一下。

Sa-Token組件介紹

SaTokenConfig

全類名路徑:cn.dev33.satoken.config.SaTokenConfig

config包下除了SaTokenConfig還有SaSignConfig、SaCookieConfig、SaTokenConfigFactory。前三個屬于配置類,最后一個Factory是用于非IOC環(huán)境下使用的類。

satoken的配置參考這一節(jié)就好Sa-Token,當(dāng)然這里完全和源碼相對應(yīng)的。

如前文所配置的,都對應(yīng)著類屬性。

############## Sa-Token 配置 (文檔: https://sa-token.cc) ##############
sa-token:
  # token 名稱(同時也是 cookie 名稱)
  token-name: Authorization
  # token 有效期(單位:秒) 默認(rèn)30天,-1 代表永久有效
  timeout: 3600
  # token 最低活躍頻率(單位:秒),如果 token 超過此時間沒有訪問系統(tǒng)就會被凍結(jié),默認(rèn)-1 代表不限制,永不凍結(jié)
  active-timeout: 1800
  # 是否允許同一賬號多地同時登錄 (為 true 時允許一起登錄, 為 false 時新登錄擠掉舊登錄)
  is-concurrent: false
  # 在多人登錄同一賬號時,是否共用一個 token (為 true 時所有登錄共用一個 token, 為 false 時每次登錄新建一個 token)
  is-share: true
  # 是否嘗試從header里讀取token
  is-read-header: true
  # 是否嘗試從cookie里讀取token
  is-read-cookie: false
  # token前綴
  token-prefix: "Bearer"
  # token 風(fēng)格(默認(rèn)可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
  token-style: tik
  # 是否輸出操作日志
  is-log: true

SaTokenConfig部分截圖如下。

Sa-Token組件介紹

SaTokenDao

全類名路徑:cn.dev33.satoken.dao.SaTokenDao

Sa-Token,官方給他的描述是:SaTokenDao 是數(shù)據(jù)持久層接口,負(fù)責(zé)所有會話數(shù)據(jù)的底層寫入和讀取。

正如次,此接口設(shè)計了如下一些操作數(shù)據(jù)讀取與寫入的方法,注意其中包含抽象方法、默認(rèn)實現(xiàn)方法和默認(rèn)空實現(xiàn)方法。

Sa-Token組件介紹

SaTokenDaodao包下還有一個默認(rèn)實現(xiàn)類SaTokenDaoDefaultImpl,當(dāng)然除此之外還有很多其他實現(xiàn)在插件工程里。

默認(rèn)實現(xiàn)SaTokenDaoDefaultImpl:Sa-Token 持久層接口,默認(rèn)實現(xiàn)類(基于內(nèi)存 Map,系統(tǒng)重啟后數(shù)據(jù)丟失)。所以在不引入其他如Redis需要注意重啟丟失的問題。

Sa-Token組件介紹

StpInterface

全類名路徑:cn.dev33.satoken.stp.StpInterface

前文講到自定義權(quán)限認(rèn)證時有講到,這個接口需要我們自己實現(xiàn)來滿足業(yè)務(wù)要求。

默認(rèn)實現(xiàn)類StpInterfaceDefaultImpl也有說明。

/**
 * 對 {@link StpInterface} 接口默認(rèn)的實現(xiàn)類
 * <p>
 * 如果開發(fā)者沒有實現(xiàn) StpInterface 接口,則框架會使用此默認(rèn)實現(xiàn)類,所有方法都返回空集合,即:用戶不具有任何權(quán)限和角色。
 * 
 * @author click33
 * @since 1.10.0
 */
public class StpInterfaceDefaultImpl implements StpInterface {

    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        return new ArrayList<>();
    }

    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        return new ArrayList<>();
    }

}

stp包下還有很重要的StpUtil、StpLogic、SaTokenInfo這次就先不講了。

SaTokenContext與SaTokenSecondContext

全類名路徑:cn.dev33.satoken.context.SaTokenContext/SaTokenSecondContext

Sa-Token,官方描述:上下文處理器封裝了當(dāng)前應(yīng)用環(huán)境的底層操作,是 Sa-Token 對接不同 web 框架的關(guān)鍵。目前 Sa-Token 僅對 SpringBoot、SpringMVC、WebFlux、Solon 等部分 Web 框架制作了 Starter 集成包, 如果我們使用的 Web 框架不在上述列表之中,則需要自定義 SaTokenContext 接口的實現(xiàn)完成整合工作。

core工程context包下的結(jié)構(gòu)是這樣的,其中SaHolder是Sa-Token 上下文持有類,你可以通過此類快速獲取當(dāng)前環(huán)境下的 SaRequest、SaResponse、SaStorage、SaApplication 對象。關(guān)于satoken的三大作用域參考官網(wǎng)這篇文章Sa-Token。

Sa-Token組件介紹

對應(yīng)上官方所說對接不同web框架,SaTokenContext的實現(xiàn)有下,當(dāng)然對于我們使用最多的可能就是SaTokenContextForString了。

Sa-Token組件介紹

SaLog

全類名路徑:cn.dev33.satoken.log.SaLog

Sa-Token 日志輸出接口,只有一個實現(xiàn)類就在同log包下SaLogForConsole。在看實現(xiàn)類的源碼時看到這個倒是漲一點知識??。挺有意思的。

/*
    // 三種寫法速度對比
    // if( config.getIsColorLog() != null && config.getIsColorLog() )  10億次,2058ms
    // if( config.getIsColorLog() == Boolean.TRUE ) 	10億次,1050ms   最快
    // if( Objects.equals(config.getIsColorLog(), Boolean.TRUE) )  	10億次,1543ms
 */

小結(jié)

關(guān)于SaManager的組件就挑上面幾個介紹了一下。

剩下的SaTempInterface(臨時 token 認(rèn)證模塊)、SaJsonTemplateJSON 轉(zhuǎn)換器)、SaSignTemplateAPI 參數(shù)簽名)、SaSameTemplateSame-Token 同源系統(tǒng)認(rèn)證模塊)就自己學(xué)習(xí)吧。

satoken組件注冊

簡單介紹了satoken的組件,就要思考這些組件在項目中是如何使用的?如何管理的?

環(huán)境聲明

這里針對如下環(huán)境來講一下。

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

<dependency>
  <groupId>cn.dev33</groupId>
  <artifactId>sa-token-redisson-jackson</artifactId>
</dependency>

依賴關(guān)系

他們分別對應(yīng)有如下依賴。

Sa-Token組件介紹

Sa-Token組件介紹

sa-token-servlet

Sa-Token組件介紹

sa-token-servlet僅僅是實現(xiàn)了前面context章節(jié)的SaStorage、SaRequest、SaResponse接口,并定義了一些錯誤碼。

sa-token-spring-boot-starter

Sa-Token組件介紹

sa-token-spring-boot-starter也很簡單,關(guān)于SpringBoot的自動裝配原理就不多講了,這里看resource/META-INF/spring.factories文件,其實SpringBoot2.7之后就換了,下面會提到。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.dev33.satoken.spring.SaTokenContextRegister

這里表示自動注入的是SaTokenContextRegister

1、注入了SaTokenContextForSpring前面也有提到,其就是在SpringMVC環(huán)境下的上下文處理器,針對處理sa-token-servlet實現(xiàn)的context

2、注入了SaPathCheckFilterForServlet路徑檢查過濾器,自己可查看其代碼,這里略過。

/**
 * 注冊 Sa-Token 框架所需要的 Bean
 *
 * @author click33
 * @since 1.34.0
 */
public class SaTokenContextRegister {

    /**
	 * 獲取上下文處理器組件 (Spring版)
	 * 
	 * @return /
	 */
    @Bean
    public SaTokenContext getSaTokenContextForSpring() {
        return new SaTokenContextForSpring();
    }

    /**
	 * 請求 path 校驗過濾器
	 *
	 * @return /
	 */
    @Bean
    public SaPathCheckFilterForServlet saPathCheckFilterForServlet() {
        return new SaPathCheckFilterForServlet();
    }

}

sa-token-redisson-jackson

Sa-Token組件介紹

好了,sa-token-spring-boot-starter解決了確定context的問題。

sa-token-redisson-jackson要解決SaTokenDao持久層實現(xiàn)的問題。前面提到SaTokenDao有很多實現(xiàn),默認(rèn)實現(xiàn)在內(nèi)存中存儲數(shù)據(jù),這里使用了redisson。

可以看到resource/META-INF/不僅有spring.factories還有spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,這就是SpringBoot2.7前后自動裝配的差別,有機(jī)會可以再探討一下。

resource/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports內(nèi)容如下

cn.dev33.satoken.dao.SaTokenDaoRedissonJackson

這里注入的是SaTokenDaoRedissonJackson,是SaTokenDao的一個實現(xiàn)類,具體方法實現(xiàn)自己學(xué)習(xí)吧??。其中SaSessionForJacksonCustomizedSaSessionJackson序列化實現(xiàn)類。

sa-token-spring-boot-autoconfig

重頭戲來了?。?!

前面那么多東西都要在這里串起來了。

Sa-Token組件介紹

直接開始!

resource/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports內(nèi)容如下

cn.dev33.satoken.spring.SaBeanRegister
cn.dev33.satoken.spring.SaBeanInject
cn.dev33.satoken.spring.sso.SaSsoBeanRegister
cn.dev33.satoken.spring.sso.SaSsoBeanInject
cn.dev33.satoken.spring.oauth2.SaOAuth2BeanRegister
cn.dev33.satoken.spring.oauth2.SaOAuth2BeanInject

這次先不看SSOOAuth2的組件。只看SaBeanRegisterSaBeanInject最基礎(chǔ)的部分。

SaBeanRegister

/**
 * 注冊Sa-Token所需要的Bean 
 * <p> Bean 的注冊與注入應(yīng)該分開在兩個文件中,否則在某些場景下會造成循環(huán)依賴 
 * @author click33
 *
 */
public class SaBeanRegister {

    /**
	 * 獲取配置Bean
	 * 
	 * @return 配置對象
	 */
    @Bean
    @ConfigurationProperties(prefix = "sa-token")
    public SaTokenConfig getSaTokenConfig() {
        return new SaTokenConfig();
    }

    /**
	 * 獲取 json 轉(zhuǎn)換器 Bean (Jackson版)
	 * 
	 * @return json 轉(zhuǎn)換器 Bean (Jackson版)
	 */
    @Bean
    public SaJsonTemplate getSaJsonTemplateForJackson() {
        return new SaJsonTemplateForJackson();
    }

    /**
	 * 應(yīng)用上下文路徑加載器
	 * @return /
	 */
    @Bean
    public ApplicationContextPathLoading getApplicationContextPathLoading() {
        return new ApplicationContextPathLoading();
    }

}

1、通過spring配置文件前綴為sa-token讀取SaTokenConfig屬性注入

2和3略過。哈哈哈哈哈

SaBeanInject

Sa-Token組件介紹

觀察SaBeanInject的結(jié)構(gòu),注意到其只有一個構(gòu)造器,剩下的都是空返回的set方法而這些方法入?yún)⒍寂c前面的SaManager里的組件幾乎完全對應(yīng)。

首先看這個構(gòu)造器,通過調(diào)用SaManager的靜態(tài)方法來設(shè)置的。

/**
 * 組件注入 
 * <p> 為確保 Log 組件正常打印,必須將 SaLog 和 SaTokenConfig 率先初始化 </p> 
 * 
 * @param log log 對象
 * @param saTokenConfig 配置對象
 */
public SaBeanInject(
        @Autowired(required = false) SaLog log, 
        @Autowired(required = false) SaTokenConfig saTokenConfig
        ){
    if(log != null) {
        SaManager.setLog(log);
    }
    if(saTokenConfig != null) {
        SaManager.setConfig(saTokenConfig);
    }
}

不知道你還記得前面有貼官方給SaManager的定義:管理 Sa-Token 所有全局組件,可通過此類快速獲取、寫入各種全局組件對象。

回過頭來看SaManager的屬性是怎么定義的,public volatile static SaTokenConfig config;保證了多線程環(huán)境下的可見性和有序性。也就是SaTokenConfig被更新后,其他線程能立刻看到變量更新。另外在getConfig方法也使用了同步塊確保線程安全地獲取config對象。

/**
 * 全局配置對象
 */
public volatile static SaTokenConfig config;	
public static void setConfig(SaTokenConfig config) {
    setConfigMethod(config);
    
    // 打印 banner 
    if(config !=null && config.getIsPrint()) {
        SaFoxUtil.printSaToken();
    }

    // 如果此 config 對象沒有配置 isColorLog 的值,則框架為它自動判斷一下
    if(config != null && config.getIsLog() != null && config.getIsLog() && config.getIsColorLog() == null) {
        config.setIsColorLog(SaFoxUtil.isCanColorLog());
    }

    // $$ 全局事件 
    SaTokenEventCenter.doSetConfig(config);
    
    // 調(diào)用一次 StpUtil 中的方法,保證其可以盡早的初始化 StpLogic
    StpUtil.getLoginType();
}
private static void setConfigMethod(SaTokenConfig config) {
    SaManager.config = config;
}

/**
 * 獲取 Sa-Token 的全局配置信息
 * @return 全局配置信息
 */
public static SaTokenConfig getConfig() {
    if (config == null) {
        synchronized (SaManager.class) {
            if (config == null) {
                setConfigMethod(SaTokenConfigFactory.createConfig());
            }
        }
    }
    return config;
}

SaBeanInject的其他方法也沒有什么特別的,自己看就行了。

可以說SaBeanInject是幫助SaManager設(shè)置屬性的重要類,是之后直接使用StpUtil、StpLogic等靜態(tài)類的靜態(tài)方法的基礎(chǔ)。

寫在最后

拙作艱辛,字句心血,望諸君垂青,多予支持,不勝感激。


個人博客:無奈何楊(wnhyang)

個人語雀:wnhyang

共享語雀:在線知識共享

Github:wnhyang - Overview

Sa-Token組件介紹文章來源地址http://www.zghlxwxcb.cn/news/detail-808912.html

到了這里,關(guān)于Sa-Token組件介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • SpringBoot 使用 Sa-Token 完成權(quán)限認(rèn)證

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

    2023年04月25日
    瀏覽(20)
  • 一文詳解 Sa-Token 中的 SaSession 對象

    Sa-Token 是一個輕量級 java 權(quán)限認(rèn)證框架,主要解決登錄認(rèn)證、權(quán)限認(rèn)證、單點登錄、OAuth2、微服務(wù)網(wǎng)關(guān)鑒權(quán) 等一系列權(quán)限相關(guān)問題。 Gitee 開源地址:https://gitee.com/dromara/sa-token 本文將詳細(xì)介紹 Sa-Token 中的不同 SaSession 對象的區(qū)別,以及各種方便的存取值的方法。 Session 是會話

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

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

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

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

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

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

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

    注解鑒權(quán) —— 優(yōu)雅的將鑒權(quán)與業(yè)務(wù)代碼分離。本篇我們將介紹在 Sa-Token 中如何通過注解完成權(quán)限校驗。 Sa-Token 是一個輕量級 java 權(quán)限認(rèn)證框架,主要解決登錄認(rèn)證、權(quán)限認(rèn)證、單點登錄、OAuth2、微服務(wù)網(wǎng)關(guān)鑒權(quán) 等一系列權(quán)限相關(guān)問題。 Gitee 開源地址:https://gitee.com/dromar

    2024年02月04日
    瀏覽(18)
  • Spring Gateway、Sa-Token、nacos完成認(rèn)證/鑒權(quán)

    Spring Gateway、Sa-Token、nacos完成認(rèn)證/鑒權(quán)

    之前進(jìn)行鑒權(quán)、授權(quán)都要寫一大堆代碼。如果使用像Spring Security這樣的框架,又要花好多時間學(xué)習(xí),拿過來一用,好多配置項也不知道是干嘛用的,又不想了解。要是不用Spring Security,token的生成、校驗、刷新,權(quán)限的驗證分配,又全要自己寫,想想都頭大。 Spring Security太重

    2024年02月09日
    瀏覽(23)
  • spring boot +Sa-Token優(yōu)雅的實現(xiàn)項目鑒權(quán)!

    spring boot +Sa-Token優(yōu)雅的實現(xiàn)項目鑒權(quán)!

    最近在做登錄、授權(quán)的功能,一開始考慮到的是spring boot + spring security,但spring security太重,而我們是輕量級的項目,所以,spring security不適合我們。 而后考慮spring boot + shiro,但shiro自帶的aop會影響spring boot的aop,所以,shiro也不適合我們。 后來瀏覽github時,發(fā)現(xiàn)Sa-Token這個框

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

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

    2024年02月09日
    瀏覽(20)
  • sa-token多端登陸實現(xiàn),PC,APP登陸分別設(shè)置token過期時間

    sa-token多端登陸實現(xiàn),PC,APP登陸分別設(shè)置token過期時間

    Sa-Token 是一個輕量級 Java 權(quán)限認(rèn)證框架,主要解決:登錄認(rèn)證、權(quán)限認(rèn)證、單點登錄、OAuth2.0、分布式Session會話、微服務(wù)網(wǎng)關(guān)鑒權(quán) 等一系列權(quán)限相關(guān)問題。 Sa-Token 目前主要五大功能模塊:登錄認(rèn)證、權(quán)限認(rèn)證、單點登錄、OAuth2.0、微服務(wù)鑒權(quán)。 登錄認(rèn)證 —— 單端登錄、多端

    2024年02月08日
    瀏覽(45)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包