Sa-Token组件介绍
个人博客:无奈何杨(wnhyang)
个人语雀:wnhyang
共享语雀:在线知识共享
Github:wnhyang - Overview
前文讲了Sa-Token介绍与SpringBoot环境下使用,但是satoken最重要的登录鉴权直接略过了,那这篇文章就开讲,😂当然不是啦。看标题就知道这次要讲的是satoken组件,为什么这么安排呢,是因为我在细致了解satoken源码后,还是非常想把satoken讲的比较清楚细致的,包含其中一些设计模式的使用、函数式接口的应用、组件注册的方法等,而要讲好这些,satoken的组件一定要讲一下吧,废话不多说了,下面开始。
必要声明:文章基于Sa-Token,版本1.37.0
satoken项目结构
下载源码
1 | git clone https://github.com/dromara/Sa-Token.git |
项目结构介绍
项目结构组织如下,结构还是相当清晰明了的。我也不可能把所有工程代码详细都讲一下,只能根据satoken最重要的模块挑一部分细致讲一下。
satoken核心
简单介绍一下satoken的项目结构,就可以步入本篇文章的正题了——satoken组件。
sa-token-core的组织结构如下,包的命名已经能说明一些什么了,接下来到了哪块就细致来说哪块。
SaManager
全类名路径:cn.dev33.satoken.SaManager
以上结构中最突出的就是SaManager了,官方给他的定义如下,可见其重要性。
1 | /** |
SaManager的结构如下,其中这些属性就是satoken最重要的组件了,下面挑出几个细讲一下。
SaTokenConfig
全类名路径:cn.dev33.satoken.config.SaTokenConfig
config包下除了SaTokenConfig还有SaSignConfig、SaCookieConfig、SaTokenConfigFactory。前三个属于配置类,最后一个Factory是用于非IOC环境下使用的类。
satoken的配置参考这一节就好Sa-Token,当然这里完全和源码相对应的。
如前文所配置的,都对应着类属性。
1 | ############## Sa-Token 配置 (文档: https://sa-token.cc) ############## |
SaTokenConfig部分截图如下。
SaTokenDao
全类名路径:cn.dev33.satoken.dao.SaTokenDao
Sa-Token,官方给他的描述是:SaTokenDao
是数据持久层接口,负责所有会话数据的底层写入和读取。
正如次,此接口设计了如下一些操作数据读取与写入的方法,注意其中包含抽象方法、默认实现方法和默认空实现方法。
与SaTokenDao同dao包下还有一个默认实现类SaTokenDaoDefaultImpl,当然除此之外还有很多其他实现在插件工程里。
默认实现SaTokenDaoDefaultImpl:Sa-Token
持久层接口,默认实现类(基于内存
Map,系统重启后数据丢失)。所以在不引入其他如Redis需要注意重启丢失的问题。
StpInterface
全类名路径:cn.dev33.satoken.stp.StpInterface
前文讲到自定义权限认证时有讲到,这个接口需要我们自己实现来满足业务要求。
默认实现类StpInterfaceDefaultImpl也有说明。
1 | /** |
同stp包下还有很重要的StpUtil、StpLogic、SaTokenInfo这次就先不讲了。
SaTokenContext与SaTokenSecondContext
全类名路径:cn.dev33.satoken.context.SaTokenContext/SaTokenSecondContext
Sa-Token,官方描述:上下文处理器封装了当前应用环境的底层操作,是 Sa-Token 对接不同 web 框架的关键。目前 Sa-Token 仅对 SpringBoot、SpringMVC、WebFlux、Solon 等部分 Web 框架制作了 Starter 集成包, 如果我们使用的 Web 框架不在上述列表之中,则需要自定义 SaTokenContext 接口的实现完成整合工作。
core工程context包下的结构是这样的,其中SaHolder是Sa-Token
上下文持有类,你可以通过此类快速获取当前环境下的
SaRequest、SaResponse、SaStorage、SaApplication
对象。关于satoken的三大作用域参考官网这篇文章Sa-Token。
对应上官方所说对接不同web框架,SaTokenContext的实现有下,当然对于我们使用最多的可能就是SaTokenContextForString了。
SaLog
全类名路径:cn.dev33.satoken.log.SaLog
Sa-Token
日志输出接口,只有一个实现类就在同log包下SaLogForConsole。在看实现类的源码时看到这个倒是涨一点知识😂。挺有意思的。
1 | /* |
小结
关于SaManager的组件就挑上面几个介绍了一下。
剩下的SaTempInterface(临时 token
认证模块)、SaJsonTemplate(JSON
转换器)、SaSignTemplate(API
参数签名)、SaSameTemplate(Same-Token
同源系统认证模块)就自己学习吧。
satoken组件注册
简单介绍了satoken的组件,就要思考这些组件在项目中是如何使用的?如何管理的?
环境声明
这里针对如下环境来讲一下。
1 | <!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ --> |
依赖关系
他们分别对应有如下依赖。
sa-token-servlet
sa-token-servlet仅仅是实现了前面context章节的SaStorage、SaRequest、SaResponse接口,并定义了一些错误码。
sa-token-spring-boot-starter
sa-token-spring-boot-starter也很简单,关于SpringBoot的自动装配原理就不多讲了,这里看resource/META-INF/spring.factories文件,其实SpringBoot2.7之后就换了,下面会提到。
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ |
这里表示自动注入的是SaTokenContextRegister。
1、注入了SaTokenContextForSpring前面也有提到,其就是在SpringMVC环境下的上下文处理器,针对处理sa-token-servlet实现的context;
2、注入了SaPathCheckFilterForServlet路径检查过滤器,自己可查看其代码,这里略过。
1 | /** |
sa-token-redisson-jackson
好了,sa-token-spring-boot-starter解决了确定context的问题。
sa-token-redisson-jackson要解决SaTokenDao持久层实现的问题。前面提到SaTokenDao有很多实现,默认实现在内存中存储数据,这里使用了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内容如下
1 | cn.dev33.satoken.dao.SaTokenDaoRedissonJackson |
这里注入的是SaTokenDaoRedissonJackson,是SaTokenDao的一个实现类,具体方法实现自己学习吧😂。其中SaSessionForJacksonCustomized是SaSession的Jackson序列化实现类。
sa-token-spring-boot-autoconfig
重头戏来了!!!
前面那么多东西都要在这里串起来了。
直接开始!
resource/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports内容如下
1 | cn.dev33.satoken.spring.SaBeanRegister |
这次先不看SSO和OAuth2的组件。只看SaBeanRegister和SaBeanInject最基础的部分。
SaBeanRegister
1 | /** |
1、通过spring配置文件前缀为sa-token读取SaTokenConfig属性注入
2和3略过。哈哈哈哈哈
SaBeanInject
观察SaBeanInject的结构,注意到其只有一个构造器,剩下的都是空返回的set方法而这些方法入参都与前面的SaManager里的组件几乎完全对应。
首先看这个构造器,通过调用SaManager的静态方法来设置的。
1 | /** |
不知道你还记得前面有贴官方给SaManager的定义:管理
Sa-Token 所有全局组件,可通过此类快速获取、写入各种全局组件对象。
回过头来看SaManager的属性是怎么定义的,public volatile static SaTokenConfig config;保证了多线程环境下的可见性和有序性。也就是SaTokenConfig被更新后,其他线程能立刻看到变量更新。另外在getConfig方法也使用了同步块确保线程安全地获取config对象。
1 | /** |
SaBeanInject的其他方法也没有什么特别的,自己看就行了。
可以说SaBeanInject是帮助SaManager设置属性的重要类,是之后直接使用StpUtil、StpLogic等静态类的静态方法的基础。
写在最后
拙作艰辛,字句心血,望诸君垂青,多予支持,不胜感激。
个人博客:无奈何杨(wnhyang)
个人语雀:wnhyang
共享语雀:在线知识共享
Github:wnhyang - Overview
