首页 - 关于研博 - 技术笔记 - Sa-Token
Sa-Token
2024.10.18

  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等静态类的静态方法的基础。

获取相关资料
下载地址将会发送至您填写的邮箱
相关新闻
深入解析GB/T 28181:构建标准化视频监控网络
2024-10-23
Vue3快速入门
2024-10-23
skywalking快速入门
2024-10-22
  • 在线客服
  • 电话咨询
  • 微信
  • 短视频