Sa-Token

1.Sa-Token 介绍

Sa-Token是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。

Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分,以登录认证为例,你只需要:

图片

无需实现任何接口,无需创建任何配置文件,只需要这一句静态代码的调用,便可以完成会话登录认证。

如果一个接口需要登录后才能访问,我们只需调用以下代码:

图片

权限认证:

图片

当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅!

2.Sa-Token组件介绍

2.1 SaManager

管理 Sa-Token 所有全局组件,可通过此类快速获取、写入各种全局组件对象。SaManager的结构如下,其中这些属性就是Sa-Token最重要的组件了,下面挑出几个细讲一下。

图片

2.2 SaTokenConfig

config包下除了SaTokenConfig还有SaSignConfig、SaCookieConfig、SaTokenConfigFactory。前三个属于配置类,最后一个Factory是用于非IOC环境下使用的类。SaTokenConfig部分截图如下。

图片

2.3 SaTokenDao

SaTokenDao 是数据持久层接口,负责所有会话数据的底层写入和读取。
正如次,此接口设计了如下一些操作数据读取与写入的方法,注意其中包含抽象方法、默认实现方法和默认空实现方法。

图片

与SaTokenDao同dao包下还有一个默认实现类SaTokenDaoDefaultImpl,当然除此之外还有很多其他实现在插件工程里。
默认实现SaTokenDaoDefaultImpl:Sa-Token 持久层接口,默认实现类(基于内存 Map,系统重启后数据丢失)。所以在不引入其他如Redis需要注意重启丢失的问题。

图片

2.4 StpInterface

因为每个项目的需求不同,其权限设计也千变万化,因此 [ 获取当前账号权限码集合 ] 这一操作不可能内置到框架中, 所以 Sa-Token 将此操作以接口的方式暴露给你,以方便你根据自己的业务逻辑进行重写。

图片

图片

2.5 SaTokenContext与SaTokenSecondContext

官方描述:上下文处理器封装了当前应用环境的底层操作,是 Sa-Token 对接不同 web 框架的关键。目前 Sa-Token 仅对 SpringBoot、SpringMVC、WebFlux、Solon 等部分 Web 框架制作了 Starter 集成包, 如果我们使用的 Web 框架不在上述列表之中,则需要自定义 SaTokenContext 接口的实现完成整合工作。
core工程context包下的结构是这样的,其中SaHolder是Sa-Token 上下文持有类,你可以通过此类快速获取当前环境下的 SaRequest、SaResponse、SaStorage、SaApplication 对象。

图片

对应上官方所说对接不同web框架,SaTokenContext的实现有下,当然对于我们使用最多的可能就是SaTokenContextForString了。                         

图片

3.Sa-Token组件注册

简单介绍了Sa-Token的组件,就要思考这些组件在项目中是如何使用的?如何管理的?

3.1环境声明


这里针对如下环境来讲一下

图片

3.2 依赖关系

他们分别对应有如下依赖。

图片

图片

3.3 sa-token-servlet

  

图片

sa-token-servlet仅仅是实现了前面context章节的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环境下的上下文处理器,针对处理sa-token-servlet实现的context;
2、注入了SaPathCheckFilterForServlet路径检查过滤器,自己可查看其代码,这里略过。

图片

3.5 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内容如下

图片

这里注入的是SaTokenDaoRedissonJackson,是SaTokenDao的一个实现类,其中SaSessionForJacksonCustomized是SaSession的Jackson序列化实现类。

3.6 sa-token-spring-boot-autoconfig

重头戏来了!!!
前面那么多东西都要在这里串起来了。

图片

resource/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports内容如下

图片

3.6.1 SaBeanRegister

通过spring配置文件前缀为Sa-Token读取SaTokenConfig属性注入

图片

3.6.2 SaBeanInject

图片

观察SaBeanInject的结构,注意到其只有一个构造器,剩下的都是空返回的set方法而这些方法入参都与前面的SaManager里的组件几乎完全对应。
首先看这个构造器,通过调用SaManager的静态方法来设置的。

图片

不知道你还记不记得前面介绍SaManager的定义:管理 Sa-Token 所有全局组件,可通过此类快速获取、写入各种全局组件对象。
回过头来看SaManager的属性是怎么定义的,public volatile static SaTokenConfig config;保证了多线程环境下的可见性和有序性。也就是SaTokenConfig被更新后,其他线程能立刻看到变量更新。另外在getConfig方法也使用了同步块确保线程安全地获取config对象。

图片

可以说SaBeanInject是帮助SaManager设置属性的重要类,是之后直接使用StpUtil、StpLogic等静态类的静态方法的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值