1.Sa-Token 介紹
Sa-Token是一個輕量級 Java 權限認證框架,主要解決:登錄認證、權限認證、單點登錄、OAuth2.0、分布式Session會話、微服務網(wǎng)關鑒權 等一系列權限相關問題。
Sa-Token 旨在以簡單、優(yōu)雅的方式完成系統(tǒng)的權限認證部分,以登錄認證為例,你只需要:
無需實現(xiàn)任何接口,無需創(chuàng)建任何配置文件,只需要這一句靜態(tài)代碼的調(diào)用,便可以完成會話登錄認證。
如果一個接口需要登錄后才能訪問,我們只需調(diào)用以下代碼:
權限認證:
當你受夠 Shiro、SpringSecurity 等框架的三拜九叩之后,你就會明白,相對于這些傳統(tǒng)老牌框架,Sa-Token 的 API 設計是多么的簡單、優(yōu)雅!
2.Sa-Token組件介紹
2.1 SaManager
管理 Sa-Token 所有全局組件,可通過此類快速獲取、寫入各種全局組件對象。SaManager的結構如下,其中這些屬性就是Sa-Token最重要的組件了,下面挑出幾個細講一下。
2.2 SaTokenConfig
config包下除了SaTokenConfig還有SaSignConfig、SaCookieConfig、SaTokenConfigFactory。前三個屬于配置類,最后一個Factory是用于非IOC環(huán)境下使用的類。SaTokenConfig部分截圖如下。
2.3 SaTokenDao
SaTokenDao 是數(shù)據(jù)持久層接口,負責所有會話數(shù)據(jù)的底層寫入和讀取。
正如次,此接口設計了如下一些操作數(shù)據(jù)讀取與寫入的方法,注意其中包含抽象方法、默認實現(xiàn)方法和默認空實現(xiàn)方法。
與SaTokenDao同dao包下還有一個默認實現(xiàn)類SaTokenDaoDefaultImpl,當然除此之外還有很多其他實現(xiàn)在插件工程里。
默認實現(xiàn)SaTokenDaoDefaultImpl:Sa-Token 持久層接口,默認實現(xiàn)類(基于內(nèi)存 Map,系統(tǒng)重啟后數(shù)據(jù)丟失)。所以在不引入其他如Redis需要注意重啟丟失的問題。
2.4 StpInterface
因為每個項目的需求不同,其權限設計也千變?nèi)f化,因此 [ 獲取當前賬號權限碼集合 ] 這一操作不可能內(nèi)置到框架中, 所以 Sa-Token 將此操作以接口的方式暴露給你,以方便你根據(jù)自己的業(yè)務邏輯進行重寫。
2.5 SaTokenContext與SaTokenSecondContext
官方描述:上下文處理器封裝了當前應用環(huán)境的底層操作,是 Sa-Token 對接不同 web 框架的關鍵。目前 Sa-Token 僅對 SpringBoot、SpringMVC、WebFlux、Solon 等部分 Web 框架制作了 Starter 集成包, 如果我們使用的 Web 框架不在上述列表之中,則需要自定義 SaTokenContext 接口的實現(xiàn)完成整合工作。
core工程context包下的結構是這樣的,其中SaHolder是Sa-Token 上下文持有類,你可以通過此類快速獲取當前環(huán)境下的 SaRequest、SaResponse、SaStorage、SaApplication 對象。
對應上官方所說對接不同web框架,SaTokenContext的實現(xiàn)有下,當然對于我們使用最多的可能就是SaTokenContextForString了。
3.Sa-Token組件注冊
簡單介紹了Sa-Token的組件,就要思考這些組件在項目中是如何使用的?如何管理的?
3.1環(huán)境聲明
這里針對如下環(huán)境來講一下
3.2 依賴關系
他們分別對應有如下依賴。
3.3 sa-token-servlet
sa-token-servlet僅僅是實現(xiàn)了前面context章節(jié)的SaStorage、SaRequest、SaResponse接口,并定義了一些錯誤碼。
3.4 sa-token-spring-boot-starter
sa-token-spring-boot-starter也很簡單,關于SpringBoot的自動裝配原理就不多講了,這里看resource/META-INF/spring.factories文件,其實SpringBoot2.7之后就換了,下面會提到。
這里表示自動注入的是SaTokenContextRegister。
1、注入了SaTokenContextForSpring前面也有提到,其就是在SpringMVC環(huán)境下的上下文處理器,針對處理sa-token-servlet實現(xiàn)的context;
2、注入了SaPathCheckFilterForServlet路徑檢查過濾器,自己可查看其代碼,這里略過。
3.5 sa-token-redisson-jackson
好了,sa-token-spring-boot-starter解決了確定context的問題。
sa-token-redisson-jackson要解決SaTokenDao持久層實現(xiàn)的問題。前面提到SaTokenDao有很多實現(xiàn),默認實現(xiàn)在內(nèi)存中存儲數(shù)據(jù),這里使用了redisson。
可以看到resource/META-INF/不僅有spring.factories還有spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,這就是SpringBoot2.7前后自動裝配的差別,有機會可以再探討一下。
resource/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports內(nèi)容如下
這里注入的是SaTokenDaoRedissonJackson,是SaTokenDao的一個實現(xiàn)類,其中SaSessionForJacksonCustomized是SaSession的Jackson序列化實現(xiàn)類。
3.6 sa-token-spring-boot-autoconfig
重頭戲來了!!!
前面那么多東西都要在這里串起來了。
resource/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports內(nèi)容如下
3.6.1 SaBeanRegister
通過spring配置文件前綴為Sa-Token讀取SaTokenConfig屬性注入
3.6.2 SaBeanInject
觀察SaBeanInject的結構,注意到其只有一個構造器,剩下的都是空返回的set方法而這些方法入?yún)⒍寂c前面的SaManager里的組件幾乎完全對應。
首先看這個構造器,通過調(diào)用SaManager的靜態(tài)方法來設置的。
不知道你還記不記得前面介紹SaManager的定義:管理 Sa-Token 所有全局組件,可通過此類快速獲取、寫入各種全局組件對象。
回過頭來看SaManager的屬性是怎么定義的,public volatile static SaTokenConfig config;保證了多線程環(huán)境下的可見性和有序性。也就是SaTokenConfig被更新后,其他線程能立刻看到變量更新。另外在getConfig方法也使用了同步塊確保線程安全地獲取config對象。
可以說SaBeanInject是幫助SaManager設置屬性的重要類,是之后直接使用StpUtil、StpLogic等靜態(tài)類的靜態(tài)方法的基礎。