重构文档结构

This commit is contained in:
click33
2022-10-10 00:59:08 +08:00
parent a27ed0ce88
commit 94e572c087
120 changed files with 286 additions and 49 deletions

81
sa-token-doc/more/blog.md Normal file
View File

@@ -0,0 +1,81 @@
# 框架博客
> 此页面收集 Sa-Token 相关技术文章,欢迎大家投稿(不限平台,按照发表日期倒叙),
> [投稿链接](https://wj.qq.com/s2/10596458/aa96/)
---
- [[ CSDN ] 【RuoYi-Vue-Plus】学习笔记 31 - Sa-Token登录验证拦截器之 Token 有效期及其续签Sa-Token 源码)](https://blog.csdn.net/Michelle_Zhong/article/details/126071871) 2022-07-30
- [[ CSDN ] 【RuoYi-Vue-Plus】学习笔记 29 - Sa-TokenV1.30.0 登录流程分析Sa-Token 源码)](https://blog.csdn.net/Michelle_Zhong/article/details/125659797) 2022-07-07
- [[ 掘金 ] sa-token过期后WebSocket提示过期](https://juejin.cn/post/7103446095987998733) 2022-5-30
- [[ 掘金 ] Sa-Token 单点登录 SSO模式二 URL重定向传播会话示例](https://juejin.cn/post/7102733249088077854) 2022-5-28
- [[ 掘金 ] SaToken技术分享](https://juejin.cn/post/7097967875670933535) 2022-5-15
- [[今日头条] SpringCloud Gateway配置Nacos服务发现Sa-Token实现接口授权](https://www.toutiao.com/article/7089584645368578567/) 2022-04-24
- [[ CSDN ] 使用sa-token 进行权限控制](https://blog.csdn.net/u012389318/article/details/124098705) 2022-4-13
- [[ 掘金 ] SpringMVC配置sa-Token](https://juejin.cn/post/7081471627766005790) 2022-4-1
- [[ CSDN ] 【SpringBoot】59、SpringBoot使用Sa-Token-Quick-Login插件快速登录认证](https://lizhou.blog.csdn.net/article/details/123571910) 2022-03-30
- [[ CSDN ] 【Sa-Token】1、Sa-Token实现登录功能](https://lizhou.blog.csdn.net/article/details/119301185) 2022-03-30
- [[ 掘金 ] 【SpringCloud-Alibaba系列教程】13.gateway网关结合Sa-token进行登录鉴权](https://juejin.cn/post/7070805258296885285) 2022-3-3
- [[ CSDN ] Sa-Token的Token有效期和临时有效期的区别](https://blog.csdn.net/ControlDemo/article/details/123177825) 2022-02-28
- [[ 掘金 ] Spring Cloud Gateway 集成Sa-Token](https://juejin.cn/post/7069748160087719967) 2022-2-28
- [[ 掘金 ] Java轻量级权限认证框架 Sa-Token 初体验](https://juejin.cn/post/7068105371839102983) 2022-2-24
- [[ CSDN ] Sa-Token获取当前所有可用Token](https://blog.csdn.net/ControlDemo/article/details/122940634) 2022-02-15
- [[ 掘金 ] 使用 Sa-Token 解决 WebSocket 握手身份认证](https://juejin.cn/post/7064232762664255525) 2022-2-14
- [[ CSDN ] sa-token配置路由拦截放行Swagger路径](https://blog.csdn.net/ControlDemo/article/details/122885782) 2022-02-11
- [[ CSDN ] sa-token 多端登录思路和遇到的坑](https://blog.csdn.net/ControlDemo/article/details/122428512) 2022-1-28
- [[ CSDN ] 【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token退出登录流程Sa-Token 源码)](https://blog.csdn.net/Michelle_Zhong/article/details/122691698) 2022-01-25
- [[ CSDN ] 【RuoYi-Vue-Plus】学习笔记 12 - Sa-Token通过注解校验用户权限Sa-Token 源码)](https://blog.csdn.net/Michelle_Zhong/article/details/122526722) 2022-01-16
- [[ CSDN ] 【RuoYi-Vue-Plus】学习笔记 11 - 集成 Sa-Token 实现登录认证流程Sa-Token 源码)](https://blog.csdn.net/Michelle_Zhong/article/details/122480703) 2022-01-13
- [[ 掘金 ] Springboot插件集成(三)-权限认证插件sa-token](https://juejin.cn/post/7051872914458542093) 2022-1-11
- [[ CSDN ] Sa-token简单介绍和基本使用](https://blog.csdn.net/weixin_43967582/article/details/122075950) 2021-12-21
- [[ CSDN ] sa-token使用源码解析 + 万字)](https://blog.csdn.net/weixin_39570751/article/details/121291274) 2021-11-12
- [[ 公众号 ] 还在用Spring Security推荐你一款使用简单、功能强大的权限认证框架](https://mp.weixin.qq.com/s/L2KOgwJcXCxrSAV8bPJsJQ) 2021-10-8
- [[ 公众号 ] Spring Security太复杂试试这个轻量、强大、优雅的权限认证框架](https://mp.weixin.qq.com/s/BWziNxRZH29F2v4Tmb5meA) 2021-09-22
- [[ 博客园 ] Sa-Token之注解鉴权优雅的将鉴权与业务代码分离](https://www.cnblogs.com/shengzhang/p/15260818.html) 2021-9-13
- [[ 掘金 ] 开箱即用!看看人家的微服务权限解决方案,那叫一个优雅!](https://juejin.cn/post/7003141949259513887) 2021-9-2
- [[ 掘金 ] 再见Spring Security推荐一款功能强大的Java权限认证框架用起来够优雅](https://juejin.cn/post/7000174417846222878) 2021-8-25
- [[ 掘金 ] 史上功能最全的 Java 权限认证框架!](https://juejin.cn/post/6986174013647093773) 2021-7-18
- [[ 知乎 ] 一个项目搞定Java权限认证框架二十多个特性开箱即用](https://zhuanlan.zhihu.com/p/390030149) 2021-7-15
- [[ 掘金 ] 从零搭建开发脚手架 集成认证授权 sa-token尝鲜](https://juejin.cn/post/6950163768533843999) 2021-4-12
- [[ 掘金 ] 权限认证就它了Sa-Token](https://juejin.cn/post/6938747514837434376) 2021-3-12
- [[ 掘金 ] sa-token之前后台分离模式下如何完成权限认证](https://juejin.cn/post/6937219472507797535) 2021-03-8
- [[ 掘金 ] 一个登录功能也能玩出这么多花样sa-token带你轻松搞定多地登录、单地登录、同端互斥登录](https://juejin.cn/post/6917884159491276808) 2021-1-15
- [[ 掘金 ] sa-token v1.9.0 版本已发布,带来激动人心新特性:同端互斥登录](https://juejin.cn/post/6914612737020526599) 2021-1-6
- [[ 掘金 ] Spring Boot 系列教程 | 第一百一篇SpringBoot整合sa-token权限框架](https://juejin.cn/post/6875525673897869319) 2020-9-23

View File

@@ -0,0 +1,126 @@
# 全局类、方法
本篇介绍 Sa-Token 中一些常用的全局对象、类
---
### SaManager
SaManager 负责管理 Sa-Token 所有全局组件。
``` java
SaManager.getConfig(); // 获取全局配置对象
SaManager.getSaTokenDao(); // 获取数据持久化对象
SaManager.getStpInterface(); // 获取权限认证对象
SaManager.getSaTokenContext(); // 获取一级Context处理对象
SaManager.getSaTokenSecondContext(); // 获取二级Context处理对象
SaManager.getSaTokenContextOrSecond(); // 获取一个可用的 Context 处理对象
SaManager.getSaTokenListener(); // 获取侦听器对象
SaManager.getSaTemp(); // 获取临时令牌认证模块对象
SaManager.getSaJsonTemplate(); // 获取 JSON 转换器 Bean
SaManager.getSaSignTemplate(); // 获取参数签名 Bean
SaManager.getStpLogic("type"); // 获取指定账号类型的StpLogic对象
SaManager.putStpLogic(stpLogic); // 向全局集合中 put 一个 StpLogic
```
### SaHolder
Sa-Token上下文持有类通过此类快速获取当前环境的相关对象
``` java
SaHolder.getContext(); // 获取当前请求的 SaTokenContext
SaHolder.getRequest(); // 获取当前请求的 [Request] 对象
SaHolder.getResponse(); // 获取当前请求的 [Response] 对象
SaHolder.getStorage(); // 获取当前请求的 [Storage] 对象
SaHolder.getApplication(); // 获取全局 SaApplication 对象
```
### SaRouter
路由匹配工具类,详细戳:[路由拦截式鉴权](/use/route-check)
### SaFoxUtil
Sa-Token内部工具类包含一些工具方法
``` java
SaFoxUtil.printSaToken(); // 打印 Sa-Token 版本字符画
SaFoxUtil.getRandomString(8); // 生成指定长度的随机字符串
SaFoxUtil.isEmpty(str); // 指定字符串是否为null或者空字符串
SaFoxUtil.isNotEmpty(str); // 指定字符串是否不是null或者空字符串
SaFoxUtil.equals(a, b); // 比较两个对象是否相等
SaFoxUtil.equals(a, b); // 比较两个对象是否相等
SaFoxUtil.getMarking28(); // 以当前时间戳和随机int数字拼接一个随机字符串
SaFoxUtil.formatDate(date); // 将日期格式化为yyyy-MM-dd HH:mm:ss字符串
SaFoxUtil.searchList(dataList, prefix, keyword, start, size, sortType); // 从集合里查询数据
SaFoxUtil.searchList(dataList, start, size, sortType); // 从集合里查询数据
SaFoxUtil.vagueMatch(patt, str); // 字符串模糊匹配
SaFoxUtil.getValueByType(obj, cs); // 将指定值转化为指定类型
SaFoxUtil.joinParam(url, parameStr); // 在url上拼接上kv参数并返回
SaFoxUtil.joinParam(url, key, value); // 在url上拼接上kv参数并返回
SaFoxUtil.joinSharpParam(url, parameStr); // 在url上拼接锚参数
SaFoxUtil.joinSharpParam(url, key, value); // 在url上拼接锚参数
SaFoxUtil.arrayJoin(arr); // 将数组的所有元素使用逗号拼接在一起
SaFoxUtil.isUrl(str); // 使用正则表达式判断一个字符串是否为URL
SaFoxUtil.encodeUrl(str); // URL编码
SaFoxUtil.decoderUrl(str); // URL解码
SaFoxUtil.convertStringToList(str); // 将指定字符串按照逗号分隔符转化为字符串集合
SaFoxUtil.convertListToString(list); // 将指定集合按照逗号连接成一个字符串
SaFoxUtil.convertStringToArray(str); // String 转 Array按照逗号切割
SaFoxUtil.convertArrayToString(arr); // Array 转 String按照逗号切割
SaFoxUtil.emptyList(); // 返回一个空集合
SaFoxUtil.toList(... strs); // String 数组转集合
```
### SaTokenConfigFactory
配置对象工厂类,通过此类你可以方便的根据 properties 配置文件创建一个配置对象
1、首先在项目根目录创建一个配置文件`sa-token.properties`
``` java
# token名称 (同时也是cookie名称)
tokenName=satoken
# token有效期单位s 默认30天, -1代表永不过期
timeout=2592000
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
activityTimeout=-1
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) =-1
isConcurrent=true
# 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
isShare=true
# token风格
isLog=false
```
2、然后使用以下代码获取配置对象
``` java
// 设置配置文件地址
SaTokenConfigFactory.configPath = "sa-token.properties";
// 获取配置信息到 config 对象
SaTokenConfig config = SaTokenConfigFactory.createConfig();
// 注入到 SaManager 中
SaManager.setConfig(config);
```
### SpringMVCUtil
SpringMVC操作的工具类位于包`sa-token-spring-boot-starter`
``` java
SpringMVCUtil.getRequest(); // 获取本次请求的 request 对象
SpringMVCUtil.getResponse(); // 获取本次请求的 response 对象
SpringMVCUtil.isWeb(); // 判断当前是否处于 Web 上下文中
```
### SaReactorHolder & SaReactorSyncHolder
Sa-Token集成Reactor时的 ServerWebExchange 工具类,位于包:`sa-token-reactor-spring-boot-starter`
``` java
// 异步方式获取 ServerWebExchange 对象
SaReactorHolder.getContext().map(e -> {
System.out.println(e);
});
// 同步方式获取 ServerWebExchange 对象
ServerWebExchange e = SaReactorSyncHolder.getContext();
System.out.println(e);
```

View File

@@ -0,0 +1,315 @@
# 常见问题排查
本篇整理大家在群聊里经常提问的一些问题如有补充欢迎提交pr
[[toc]]
---
<!-- ---------------------------- 常见报错 ----------------------------- -->
## 一、常见报错
### Q报错非Web上下文无法获取Request
报错原因Sa-Token 的部分 API 只能在 Web 上下文中调用,报这个错说明你调用 Sa-Token 的地方不在 Web 上下文中,请排查:
1. 是否在 main 方法中调用了 Sa-Token 的API
2. 是否在带有 `@Async` 注解的方法中调用了 Sa-Token 的API
3. 是否在一些丢失web上下文的子线程中调用了 Sa-Token 的API例如 `MyBatis-Plus``insertFill` 自动填充
4. 是否在一些非 Http 协议的 RPC 框架中(例如 Dubbo调用了 Sa-Token 的API
5. 是否在 SpringBoot 启动初始化的方法中调用了 Sa-Token 的API例如`@PostConstruct`
解决方案:先获取你想要的值,再把这个值当做一个参数传递到这些方法中,而不是直接从方法内调用 Sa-Token 的API。
### Q报错未初始化任何有效上下文处理器
报错原因Sa-Token底层不能确认最终运行的web容器所以抽象了 `SaTokenContext` 接口,对接不同容器时需要注入不同的实现,通常这个注入工作都是框架自动完成的,
你只需要按照文档开始部分集成相应的依赖即可
如果报了这个错误,说明框架没有注入正确的上下文实现,请排查:
1. 如果你的项目是微服务项目,请直接参考:[微服务-依赖引入说明](/micro/import-intro),如果是单体项目,请往下看:
2. 请判断你的项目是 SpringMVC 环境还是 WebFlux 环境
- 如果是 SpringMVC 环境就引入 `sa-token-spring-boot-starter` 依赖,参考:[在SpringBoot环境集成](/start/example)
- 如果是 WebFlux 环境就引入 `sa-token-reactor-spring-boot-starter` 依赖,参考:[在WebFlux环境集成](/start/webflux-example)
- 引入错误的依赖会导致`SaTokenContext`初始化失败,抛出上述异常
- 如果你还无法分辨你是哪个环境,就看你的 pom.xml 依赖,如果引入了`spring-boot-starter-web`就是SpringMVC环境如果引入了 `spring-boot-starter-webflux` 就是WebFlux环境。……什么你说你两个都引入了那你的项目能启动成功吗
3. 如果是 WebFlux 环境而且正确引入了依赖,依然报错,**请检查是否注册了全局过滤器,在 WebFlux 下这一步是必须的**。
4. 如果以上步骤排除无误后依然报错,请直接提 issue 或者加入QQ群求助。
### Q报错NotLoginExceptionxxx
这个错是说明调用接口的人没有通过登录校验,请注意通常**异常提示语已经描述清楚了没有通过认证的具体原因:**
**如果是未能读取到有效Token**
- 可能1前端没有提交 Token最好从前端f12控制台看看请求参数里有 token 吗)。
- 可能2前端提交了 Token但是参数名不对。默认参数名是 `satoken`,可通过配置文件 `sa-token.token-name: satoken` 来更改。
- 可能3前端提交了 Token但是你配置了框架不读取比如说你配置了 `is-read-header=false`关闭header读取此时你再从 header 里提交token框架就无法读取到。
- 可能4前端提交了 Token但是 Token前缀 不对,可参考:[自定义 Token 前缀](/up/token-prefix)
- 可能5你使用了 Nginx 反向代理,而且配置了 自定义Token名称而且自定义的名称还带有下划线比如 shop_token而且还是你的项目还是从 Header头提交Token的此时 Nginx 默认会吞掉你的下划线参数,可参考:[nginx做转发时带下划线的header参数丢失](https://blog.csdn.net/zfw_666666/article/details/124420828)
**如果是Token无效6ad93254-b286-4ec9-9997-4430b0341ca0**
- 可能1前端提交的 token 是乱填的,或者从别的项目拷过来的,或者多个项目一起开发时彼此的 Token 串项目了。
- 可能2前端提交的 token 已过期timeout超时了
- 可能3在不集成 Redis 的情况下:颁发 token 后,项目重启了,导致 token 无效。
- 可能4在集成 Redis 的情况下:颁发 token 后Redis重启了导致 token 无效。
- 可能5你提交的 token 和框架读取到的 token 不一致:
- 可能5.1:比如说你配置了`is-read-header=false`关闭header读取然后你从header提交`token-A`而框架从Cookie里读取`token-B`,导致鉴权不通过(框架读取顺序为`body->header->cookie`
- 可能5.2:比如说你配置了`token-name=x-token`自定义token名称此时你从header提交`satoken:token-A`参数名没对上然后框架从header里读取不到你提交的token转而继续从Cookie读取到了`token-B`
- 可能6在集成 jwt 插件的情况下:
- 如果使用的是 Simple 模式情况和不集成jwt一样。
- 如果使用的是 Mixin 和 Stateless 模式:查看这个 token 颁发后是否更改了 `jwtSecretKey` 配置项。
- 可能7同一账号登录数量超过12个导致最先登录的被强制注销掉这个值可以通过 `maxLoginCount` 来配置默认值12-1代表不做限制。
- 可能8在配置了 `is-concurrent=true, is-share=true`的情况下你和别人共同登录了同一账号此时对方注销了登录由于你们使用的是同一个token导致你这边的会话也失效了。
- 可能9可能是多账号鉴权的关系在多账号模式下如果是 `StpUserUtil.login()` 颁发的token你从 `StpUtil.checkLogin()` 进行校验永远都是无效token因为账号体系没对上。
**如果是Token已过期6ad93254-b286-4ec9-9997-4430b0341ca0**
- 可能1前端提交的 token 临时过期activity-timeout超时了比如配置了 activity-timeout=120但是超过了120秒没有访问接口
- 可能2集成jwt而且使用的是 Mixin 或 Stateless 模式而且token过期了timeout超时了
**如果是Token已被顶下线6ad93254-b286-4ec9-9997-4430b0341ca0**
- 可能1在项目配置了 `is-concurrent=false` 的前提下,这个账号又被别人登录了,导致旧登录被挤了下去。
- 可能2这个账号被 `StpUtil.replaced(loginId, device)` 方法强制顶下线了。
**如果是Token已被踢下线6ad93254-b286-4ec9-9997-4430b0341ca0**
- 可能1这个账号被 `StpUtil.kickout(loginId)` 方法强制踢下线了。
### Q集成 Redis 后,明明 Redis 中有值却还是提示无效Token
根据以往的处理经验,发生这种情况 90% 的概率是因为你找错了Redis代码连接的Redis和你用管理工具看到的Redis并不是同一个。
你可能会问:我看配置文件明明是同一个啊?
我的回答是:别光看配置文件,不一定准确,在启动时直接执行 `SaManager.getSaTokenDao().set("name", "value", 100000);`
随便写入一个值看看能不能根据你的预期写进这个Redis如果能的话才能证明`代码连接的Reids``你用管理工具看到的Redis` 是同一个,再进行下一步排查。
### Q加了注解进行鉴权认证不生效
1. 注解鉴权功能默认关闭两种方式任选其一进行打开注册注解拦截器、集成AOP模块参考[注解式鉴权](/use/at-check)
2. 在Spring环境中, 如果同时配置了`WebMvcConfigurer``WebMvcConfigurationSupport`时, 也会导致拦截器失效.
- **常见场景**: 很多项目中会在`WebMvcConfigurationSupport`中配置`addResourceHandlers`方法开放Swagger等相关静态资源映射, 同时基于Sa-Token添加了`WebMvcConfigurer`配置`addInterceptors`方法注册注解拦截器, 这样会导致注解拦截器失效.
- **解决方案**: `WebMvcConfigurer``WebMvcConfigurationSupport`只选一个配置, 建议统一通过实现`WebMvcConfigurer`接口进行配置.
3. 如果以上步骤处理后仍然没有效果,加群说明一下复现步骤
### Q我加了拦截器鉴权但是好像没有什么效果请求没有被拦截住
- 可能1这个拦截器可能没有注册成功。
- 可能2你访问的请求没有进入这个拦截器。
尝试按照下面的代码测试一下看看:
``` java
// 注册拦截器
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println("--------- flag 1");
registry.addInterceptor(new SaInterceptor(handle -> {
System.out.println("--------- flag 2");
StpUtil.checkLogin(); // 登录校验,只有会话登录后才能通过这句代码
}))
.addPathPatterns("/user/**")
.excludePathPatterns("/user/doLogin");
}
}
```
在启动时 `flag 1` 被打印出来,才证明拦截器注册成功了,在访问请求时 `flag 2` 被打印出来,才证明请求进入了拦截器。
如果拦截器没有注册成功,则:
- 可能1SpringBoot 版本较高(`>= 2.6.0`),请尝试在启动类加上 `@EnableWebMvc` 注解再重新启动。
- 可能2`SaTokenConfigure` 配置类不在启动类的同包或者子包下,导致没有被 SpringBoot 扫描到。
- 可能3`SaTokenConfigure` 配置类在启动类的同包或者子包下,但启动类上加了 `@ComponentScan("com.xxx")` 注解,导致包扫描范围不正确,请将此注解删除或移动到其它配置类上。
- 可能4项目属于 Maven 多模块项目,`SaTokenConfigure` 和启动类没有在一个模块,且启动类模块没有引入配置类的模块,导致加载不到。
如果拦截器已经注册成功,但请求没有进入拦截器:
- 可能1你访问的 path没有被 `.addPathPatterns("/user/**")` 拦截住。
- 可能2你访问的 path被 `.excludePathPatterns("/xxx/xx")` 排除掉了。
- 可能3你访问的是另一个项目请把当前项目停掉看看你的请求还能不能访问成功。
注:以上的排查步骤,对过滤器不生效的情形一样适用。
### Q我使用拦截器鉴权时明明排除了某个路径却仍然被拦截了
- 可能1你的项目可能是跨域了先把跨域问题解决掉参考[解决跨域问题](/fun/cors-filter)
- 可能2你访问的接口可能是404了SpringBoot环境下如果访问接口404后会被转发到`/error`,然后被再次拦截。请确保你访问的 path 有对应的 Controller 承接!
- 可能3可能这里并没有拦截但是又被其他地方拦截了。请先把这个拦截器给注释掉看看还会不会拦截如果依然拦截那说明不是这个拦截器的锅请仔细查看一下控制台抛出的堆栈信息定位一下到底是哪行代码拦截住这个请求的。
- 可能4后端拦截的 path 未必是你前端访问的这个path建议先打印一下 path 信息,看看和你预想的是否一致,再做分析。
- 可能5你写了多个匹配规则请求只越过了第一个规则被其它规则拦下了例如以下代码
``` java
registry.addInterceptor(new SaInterceptor(handler -> {
SaRouter.match("/**").notMatch("/user/doLogin").check(r -> StpUtil.checkLogin()); // 第1个规则
SaRouter.match("/**").notMatch("/article/getList").check(r -> StpUtil.checkLogin()); // 第2个规则
SaRouter.match("/**").notMatch("/goods/getList").check(r -> StpUtil.checkLogin()); // 第3个规则
})).addPathPatterns("/**");
```
以上代码,当你未登录访问 `/user/doLogin` 时会被第1条规则越过然后被第2条拦下校验登录然后抛出异常`NotLoginExceptionxxx`
### Q有时候我不加 Token 也可以通过鉴权,请问是怎么回事?
可能1你访问的这个接口根本就没有鉴权的代码所以可以安全的访问通过。
可能2可能是 Cookie 帮你自动提交了 Token在浏览器或 Postman 中会自动维护Cookie模式如不需要可以在配置文件`is-read-cookie: false`,然后重启项目再测试一下。
### Q一个 User 对象存进 Session 后,再取出来时报错:无法从 User 类型转换成 User 类型?
可能1你的 User 类中途换了包名,导致存进去时和取出来时对不上,无法成功创建实例。
可能2你打开了代码热刷新模式先存进去的对象热刷新后再取出会报错关闭热刷新即可解决。
### Q我配置了 active-timeout 值,但是当我每次续签时 Redis 中的 ttl 并没有更新,是不是 bug 了?
不更新是正常现象,`active-timeout`不是根据 ttl 计算的是根据value值计算的value 记录的是该 Token 最后访问系统的时间戳,
每次验签时用:当前时间 - 时间戳 > active-timeout来判断这个 Token 是否已经超时。
### Q整合 Redis 时先选择了默认jdk序列化后又改成 jackson 序列化程序开始报错SerializationException
两者的序列化算法不一致导致的反序列化失败,如果要更改序列化方式,则需要先将 Redis 中历史数据清除,再做更新。
### Q调用 `StpUtil.getExtra("name")` 报错:`this api is disabled`。
`StpUtil.getExtra(key)` 是给 sa-token-jwt 插件提供的不集成这个插件就不能调用这个API如果是普通模式需要存储自定义参数请在 SaSession 上存储
``` java
// 在登录时缓存参数
StpUtil.getSession().set("name", "zhangsan");
// 然后我们就可以在任意处获取这个参数
String name = StpUtil.getSession().getString("name");
```
### Q我加了 Sa-Token 的全局过滤器,浏览器报错跨域了怎么办?
参考:[https://blog.csdn.net/shengzhang_/article/details/119928794](https://blog.csdn.net/shengzhang_/article/details/119928794)
### Q集成redis后对象模型序列化异常
假设执行如下代码:
``` java
@Data
public class User implements Serializable {
private Long userId;
private String username;
private String password;
}
User user = new User();
user.setUserId(10000L);
user.setUsername("oneName");
user.setPassword("onePass");
StpUtil.getSession().set("userObjKey", user); // 这里报错
```
报错信息如下:
```
SerializationException: Could not read JSON:
Cannot deserialize value of type `java.lang.Long` from Array value (token `JsonToken.START_ARRAY`)
```
springboot 集成 satoken redis 后, 一旦 springboot 切换版本就有可能出现此问题
原因是redis里面有之前的 satoken 会话数据, 清空 Redis 即可
<!-- ---------------------------- 常见疑问 ----------------------------- -->
## 二、常见疑问
### Q登录方法需要我自己实现吗
是的,不同于`shiro`等框架,`Sa-Token`不会在登录流程中强插一脚,开发者比对完用户的账号和密码之后,只需要调用`StpUtil.login(id)`通知一下框架即可
### Q框架抛出的权限不足异常我想根据自定义提示信息可以吗
可以,在全局异常拦截器里捕获`NotPermissionException`,可以通过`getPermission()`获取没有通过认证的权限码,可以据此自定义返回信息
### Q我的项目权限模型不是RBAC模型很复杂可以集成吗
无论什么模型只要能把一个用户具有的所有权限塞到一个List里返回给框架就能集成
### QStpInterface 接口的 方法,在什么时候执行?
每次鉴权时执行,例如你调用了 `StpUtil.checkgetPermission("xxx")` 方法,框架就会调用底层的 `StpInterface#getPermissionList` 方法来获取权限数据。
如果你的 `getPermissionList` 里有读数据库的代码,那么你每鉴一次权,系统将访问一次数据库。如果要减小性能消耗,可以把权限数据放在缓存中,参考:[把权限放在缓存里](/fun/jur-cache)。
### Q当我配置不并发登录时每次登陆都会产生一个新的 Token旧 Token 依然被保存在 Redis 中,框架为什么不删除呢?
首先,不删除旧 Token 的原因是为了在旧 Token 再次访问系统时提示他:已被顶下线。
而且这个 Token 不会永远留在 `Redis` 里,在其 TTL 到期后就会自动清除,如果你想让它立即消失,可以:
- 方法一:配置文件把 `is-concurrent` 和 `is-share` 都打开,这样每次登陆都会复用以前的旧 Token就不会有废弃 Token 产生了。
- 方法二:每次登录前把先调用注销方法 `StpUtil.logout(10001)` ,把这个账号的旧登录都给清除了。
- 方法三:写一个定时任务查询 Redis 值进行删除。
### Q我使用过滤器鉴权 or 全局拦截器鉴权,结果 Swagger 不能访问了,我应该排除哪些地址?
尝试加上排除 `"/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**" ,"/doc.html/**","/error","/favicon.ico"`
不同版本可能会有所不同,其实在前端摁一下 `F12` 看看哪个 url 报错排除哪个就行了(另附:注解鉴权是不需要排除的,因为 `Swagger` 本身也没有使用 Sa-Token 的注解)
### QSaRouter.match 有多个路径需要排除怎么办?
可以点进去源码看一下,`SaRouter.match`方法有多个重载,可以放一个集合, 例如:
``` java
SaRouter.match("/**").notMatch("/login", "/reg").check(r -> StpUtil.checkLogin());
```
### Q为什么StpUtil.login() 不能直接写入一个User对象
`StpUtil.login()`只是为了给当前会话做个唯一标记,通常写入`UserId`即可如果要存储User对象可以使用`StpUtil.getSession()`获取Session对象进行存储。
### Q前后台分离模式下和普通模式有何不同
主要是失去了`Cookie`无法自动化保存和提交`token秘钥`,可以参考章节:[前后台分离](/up/not-cookie)
### Q前后台分离时前端提交的 header 参数是叫 token 还是 satoken 还是 tokenName
默认是satoken如果想换一个名字更改一下配置文件的`tokenName`即可。
### Q一个账号拥有哪些权限可以做成动态的吗
权限本来就是动态的,框架预留的 `StpInterface` 接口,就是为了让你可以写任意代码来获取数据
### Q路由拦截鉴权可以做成动态的吗
参考:[把路由拦截鉴权动态化](/fun/dynamic-router-check)
### Q我不想让框架自动操作Cookie怎么办
在配置文件将`isReadCookie`值配置为`false`
### Q怎么关掉每次启动时的字符画打印
在配置文件将`isPrint`值配置为`false`
### QStpUtil.getSession()必须登录后才能调用吗?如果我想在用户未登录之前存储一些数据应该怎么办?
`StpUtil.getSession()`获取的是`User-Session`必须登录后才能使用如果需要在未登录状态下也使用Session功能请使用`Token-Session` <br>
步骤:先在配置文件里将`tokenSessionCheckLogin`配置为`false`,然后通过`StpUtil.getTokenSession()`获取Session
### Q我只使用header来传输token还需要打开Cookie模式吗
不需要如果只使用header来传输token可以在配置文件关闭Cookie模式`isReadCookie=false`
### Q我想让用户修改密码后立即掉线重新登录应该怎么做
框架内置 [强制指定账号下线] 的APi在执行修改密码逻辑之后调用此API即可: `StpUtil.logout()`
### Q代码鉴权、注解鉴权、路由拦截鉴权我该如何选择
这个问题没有标准答案,这里只能给你提供一些建议,从鉴权粒度的角度来看:
1. 路由拦截鉴权:粒度最粗,只能粗略的拦截一个模块进行权限认证
2. 注解鉴权:粒度较细,可以详细到方法级,比较灵活
3. 代码鉴权粒度最细不光可以控制到方法级甚至可以if语句决定是否鉴权
So从鉴权粒度的角度来看需要针对一个模块鉴权的时候就用路由拦截鉴权需要控制到方法级的时候就用注解鉴权需要根据条件判断是否鉴权的时候就用代码鉴权
### QSa-Token的全局过滤器我应该怎么指定它的优先级呢
为了保证相关组件能够及时初始化,框架默认给过滤器注册的优先级为-100如果你想更改优先级直接在注册过滤器的方法上加上 `@Order(xxx)` 即可覆盖框架的默认配置
### Q还是有不明白到的地方?
请在`gitee` 、 `github` 提交 `issues`或者加入qq群交流群链接在[首页](README?id=交流群)

View File

@@ -0,0 +1,20 @@
# 加入讨论群
加入 Sa-Token 专属讨论群,与众多大佬一起努力 (huá shǔi) 成长 (mō yú)。
---
### 1、加入QQ交流群
![QQ群](https://oss.dev33.cn/sa-token/qq-group-2.png ':size=180')
QQ交流群614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=F96A2mrl)
### 2、加入微信交流群
![微信群](https://oss.dev33.cn/sa-token/wx-qr-300.png ':size=180')
扫码添加微信备注sa邀您加入群聊

97
sa-token-doc/more/link.md Normal file
View File

@@ -0,0 +1,97 @@
# 使用 Sa-Token 的开源项目
> 集成 Sa-Token 的开源案例收集,取自 [Awesome-Sa-Token](https://gitee.com/sa-token/awesome-sa-token),定期同步。
---
### 后台管理
- [[ Sa-Plus ]](https://gitee.com/click33/sa-plus):一个基于 SpringBoot 架构的快速开发框架,内置代码生成器。
- [[ dcy-fast ]](https://gitee.com/dcy421/dcy-fast):一个基于 SpringBoot + Sa-Token + Mybatis-Plus 的后台管理系统前端vue-element-admin并且内置代码生成器。
- [[ Helio-Boot ]](https://gitee.com/uncarbon97/helio-boot):基于 SpringBoot + Sa-Token + Mybatis-Plus 的单体开发脚手架,带有配套后台管理前端模板及代码生成器;拥有对应微服务版脚手架`Helio-Cloud`
- [[ EasyAdmin ]](https://gitee.com/lakernote/easy-admin)一个基于SpringBoot2 + Sa-Token + Mybatis-Plus + Snakerflow + Layui 的后台管理系统,灵活多变可前后端分离,也可单体,内置代码生成器、权限管理、工作流引擎等
- [[ RuoYi-Vue-Plus ]](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/)重写RuoYi-Vue所有功能 集成 Sa-Token+Mybatis-Plus+Jackson+Xxl-Job+knife4j+Hutool+OSS 定期同步
- [[ SpringBoot_v2 ]](https://gitee.com/bdj/SpringBoot_v2)SpringBoot_v2项目是努力打造springboot框架的极致细腻的脚手架。
- [[ Ruoyi-Satoken ]](https://gitee.com/wangming123456/ruoyi-satoken):为 ruoyi 进行配置 sa-token
- [[ vue-satoken-admin ]](https://gitee.com/niluni/vue-satoken-admin)基于Vue2和Sa-Token1.18.0的后台权限系统。
- [[ 人事管理系统后端 ]](https://gitee.com/sdones_1512/personnel-management-system-back-end)人事管理系统后端框架springboot持久层mybatis缓存redis权限sa-token
- [[ bootx-platform ]](https://gitee.com/bootx/bootx-platform)集成sa-token和sa-token-plugin并深度定制认证模块包含多级别数据范围权限、数据自动加解密、数据脱敏、超级查询器、以及支付收单、消息通知等准商用功能的开源免费开发脚手架项目
- [[ spba-admin ]](https://gitee.com/qkdja/spring-boot-admin)基于SpringBoot、Vue开发的通用后台管理系统做到开箱即用为新项目开发省去了基础功能开发的步骤。主要使用Sa-Token权限认证、MyBatis-Plus、MySQL、Redis、validation、七牛云等技术。
- [[ QForum-Core ]](https://github.com/Project-QForum/QForum-Core/)QForum 论坛系统官方核心,可拓展性强、轻量级、高性能、前后端分离,基于 SpringBoot2 + Sa-Token + Mybatis-Plus
- [[ ExciteCMS-Layui ]](https://gitee.com/ExciteTeam/ExciteCMS-SpringBoot-Layui)ExciteCMS 快速开发脚手架:一款后端基于 SpringBoot2 + Sa-Token + Mybatis-Plus前端基于 Layuimini 的内容管理系统具备RBAC、日志管理、代码生成等功能并集成常用的支付、OSS等第三方服务拥有详细的开发文档
- [[ sss-rbac-admin ]](https://gitee.com/momoljw/sss-rbac-admin)基于springboot整合satoken、sqltoy的权限管理系统
- [[ QuickBuild ]](https://gitee.com/CodeLiQing/custom-quick-build-platform): 快速构建 | 基于springboot+sa-token+neety+代码生产器生成vue页面和增删改查代码| 以及前端vue3和字节arco.design框架整合
- [[ magic-boot ]](https://gitee.com/ssssssss-team/magic-boot):基于 magic-api + Sa-Token 搭建的快速开发平台可以实现在浏览器编写Vue代码既改即生效
- [[ chaos ]](https://gitee.com/qishanor/chaos):一个基于 SpringBoot + Sa-Token + Mybatis-Plus的快速开发框架前端vue-element-avue,内置代码生成器,代码最简洁,最佳学习实践方案。
- [[ xzadmin ]](https://gitee.com/xiaozhizxj/xzadmin):一个基于 Spring Boot+mybatis-plus+sotaken+Redis+Thymeleaf+hutool+easy-captcha+log4j的后台管理系统
- [[ Snowy ]](https://gitee.com/xiaonuobase/snowy):国内首个国密前后分离快速开发平台,采用 Vue3 + AntDesignVue3 + Vite + SpringBoot + Mp + HuTool + SaToken
### 微服务相关
- [[ RuoYi-Cloud-Plus ]](https://gitee.com/JavaLionLi/RuoYi-Cloud-Plus)重写RuoYi-Cloud所有功能 整合 SpringCloudAlibaba + Sa-Token + Dubbo + Mybatis-Plus + Xxl-Job 全方位升级 定期同步
- [[ Sp-Cloud ]](https://gitee.com/click33/sp-cloud)Sa-Plus的微服务版本, 基于Spring-Cloud-Alibaba微服务下使用Sa-Token的样例
- [[ YC-Framework ]](http://framework.youcongtech.com/):致力于打造一款优秀的分布式微服务解决方案
- [[ falser-cloud ]](https://gitee.com/falser/falser-cloud): 基于 SpringCloud Alibaba + SpringCloud gateway + SpringBoot + Sa-Token + vue-admin-template + Nacos + Rabbit MQ + Redis 的一个后台管理系统,前后端分离,权限管理,菜单管理,数据字典,停车场系统管理等功能
- [[ Huanxing-mall ]](https://gitee.com/lijiaxing_boy/huanxing-mall)HuanXing 商城基于SpringCloud 2021 & Alibaba + Sa-token前端基于 Vue3 +Element plus 的微服务商城
- [[ dcy-fast-cloud ]](https://gitee.com/dcy421/dcy-fast-cloud):一个基于 SpringCloudAlibaba + Sa-Token + dubbo2.7.8 + Seata + knife4j + Mybatis-Plus + MapStruct + 的后台管理系统前端vue-element-admin并且内置代码生成器+动态路由权限等功能
- [[ fhs-framework ]](https://gitee.com/fhs-opensource/fhs-framework)基于Springboot+Springcloud + Mybatis Plus + Sa-Token + Vue + ElementUI 的快速开发平台(低代码开发平台),本框架永远免费,永久全开源
- [[ Pig-Satoken ]](https://gitee.com/wchenyang/cloud-satoken):重写 Pig 授权方式为 Sa-Token其他代码不变。
- [[ Helio-Cloud ]](https://gitee.com/uncarbon97/helio-cloud):基于 SpringBoot + SpringCloud Alibaba + Sa-Token + Mybatis-Plus 的微服务开发脚手架,带有配套后台管理前端模板及代码生成器
- [[ BudWk-V7 ]](https://gitee.com/budwk/budwk):基于 NutzBoot + Sa-Token + Dubbo + Nacos注册&配置中心 的微服务开发脚手架(同时提供单应用版本),带有配套后台管理前端模板及代码生成器
### 插件
- [[ Sa-Token-Plugin ]](https://gitee.com/bootx/sa-token-plugin)Sa-Token第三方插件实现基于Sa-Token-Core提供一些与官方不同实现机制的的插件集合作为Sa-Token开源生态的补充
- [[ quarkus-sa-token ]](https://github.com/quarkiverse/quarkus-sa-token) quarkus 整合 Sa-Token。
### 其它
- [[ jthink ]](https://gitee.com/wtsoftware/jthink) 一个基于 SpringBoot + Sa-Token + Thymeleaf 的博客系统
- [[ Sa-Token-Study ]](https://gitee.com/click33/sa-token-study)以demo示例的方式讲解 Sa-Token 源码涉及到的技术点,连载中……
- [[ SpringMvc+Sa-Token ]](https://gitee.com/SRD_01/spring-mvc-sa-token): Jsp+SpringMVC+SSO+Sa-Token+Redis | Spring MVC 集成 SaToken Demo 项目
- [[ iot-kit ]](https://gitee.com/iotkit-open-source/iotkit-parent)一个轻量级低门槛的物联网平台包含了多协议设备接入、规则引擎、第三方平台接入、智能家居小程序等模块的项目基于SpringBoot架构并集成了Sa-Token的OAuth2认证。
- [[ 拾壹博客 ]](https://gitee.com/quequnlong/shiyi-blog)一款vue+springboot前后端分离的博客系统博客后台管理系统使用了vue+elmentui开发后端使用Sa-Token进行权限管理,支持动态菜单权限动态定时任务文件支持本地和七牛云上传使用ElasticSearch作为全文检索服务支持QQ、微博、码云登录。
- [[ cubic ]](https://gitee.com/dromara/cubic)一站式问题定位平台实时线程栈监控、线程池监控、动态arthas命令集、依赖分析等等等助你快速定位问题。

View File

@@ -0,0 +1,63 @@
# Sa-Token 名词解释
Sa-Token 无意发明任何晦涩概念提升逼格,但在处理 issue 、Q群解答时还是发现不少同学因为一些基本概念理解偏差导致代码出错
所以整理本篇针对一些比较容易混淆的地方加以解释说明。
也希望各位同学在提交 issue、Q群提问之前充分阅读本篇文章保证不要因为基本概念理解偏差增加不必要的沟通成本。
---
#### 几种 Token
- token指通过 `StpUtil.login()` 登录产生的身份令牌用来维护用户登录状态也称satoken、会话Token。
- temp-token指通过 `SaTempUtil.createToken()` 临时验证模块产生的Token也称临时Token。
- Access-Token在 OAuth2 模块产生的身份令牌,也称:访问令牌、资源令牌。
- Refresh-Token在 OAuth2 模块产生的刷新令牌,也称:刷新令牌。
- Id-Token在 SaIdUtil 模块生成的Token令牌用于提供子服务外网隔离功能。
#### 两种过期时间:
- timeout会话 Token 的长久有效期。
- activity-timeout会话的临时有效期。
两者的差别详见:[Token有效期详解](/fun/token-timeout)
#### 三种Session
- User-Session框架为每个账号分配的 Session 对象也称账号Session。
- Token-Session框架为每个 Token 分配的 Session 对象也称令牌Session。
- Custom-Session以一个特定的值作为SessionId来分配的 Session 对象也称自定义Session。
三者差别详见:[Session模型详解](/fun/session-model)
#### 账号标识:
- loginId账号id用来区分不同账号通过 `StpUtil.login(id)` 来指定。
- device登录设备类型例如`PC``APP`,通过 `StpUtil.login(id, device)` 来指定。
- loginType账号类型用来区分不同体系的账号如同一系统的 `User账号``Admin账号`,详见:[多账号认证](/up/many-account)
#### 几种登录策略:
- 单地登录:指同一时间只能在一个地方登录,新登录会挤掉旧登录,也可以叫:单端登录。
- 多地登录:指同一时间可以在不同地方登录,新登录会和旧登录共存,也可以叫:多端登录。
- 同端互斥登录在同一类型设备上只允许单地点登录在不同类型设备上允许同时在线参考腾讯QQ的登录模式手机和电脑可以同时在线但不能两个手机同时在线。
- 单点登录:在进入多个系统时,只需要登录一次即可。解决用户在不同系统间频繁登录的问题。
- 同端多登录:指在一个终端可以同时登录多个账号。
- 记住我模式:指在一个设备终端登录成功,该设备重启之后依然保持登录状态。
#### 几种注销策略:
- 单端注销:只在调用登录的一端注销。
- 全端注销:一端注销,全端下线。
- 单点注销:与单点登录对应,一个系统注销,所有系统一起下线。
#### 几种鉴权方式:
- 代码鉴权:在代码里直接调用 `StpUtil.checkXxx` 相关 API 进行鉴权。
- 注解鉴权:在方法或类上添加 `@SaCheckXxx` 注解进行鉴权。
- 路由拦截鉴权:在全局过滤器或拦截里通过:`SaRouter.match()` 拦截路由进行鉴权。

View File

@@ -0,0 +1,95 @@
# 赞助 Sa-Token
---
Sa-Token 采用 Apache-2.0 开源协议,**承诺框架本身与官网文档永久免费开放**
但是框架的日常更新与社区运营需要付出大量的精力,靠爱发电难以长久,如果 Sa-Token 帮助到了您,您可以友情支持一下 Sa-Token。
### 友情赞助
您可以在项目 [Gitee](https://gitee.com/dromara/sa-token) 主页进行捐赠
![gitee-zanzhu2.png](https://oss.dev33.cn/sa-token/doc/gitee-zanzhu2.png)
#### 已捐赠列表:
<p class="zanzhu-pre"></p>
| 赞助人 | 赞助金额 | 留言 | 时间 |
| :-------- | :-------- | :-------- | :-------- |
| [BlueRose](https://gitee.com/Bluerose_2) | ¥ 20.0 | 感谢您的付出,项目非常棒! | 2022-09-22 |
| [邱道长](https://gitee.com/qiudaozhang) | ¥ 20.0 | 优秀的项目,赞 | 2022-09-09 |
| [jerrydo](https://gitee.com/jerrydo) | ¥ 10.0 | 感谢您的开源项目!很强大! | 2022-08-10 |
| [小北宸呀](https://gitee.com/a_aas) | ¥ 10.0 | 感谢您的开源项目!我就喜欢你这种把我当白痴的官方文档 | 2022-07-08 |
| [jwc_gitee](https://gitee.com/jwc-gitee) | ¥ 10.0 | 感谢您的开源项目! | 2022-07-07 |
| [zhihong](https://gitee.com/zzh13520704819) | ¥ 20.0 | 感谢您的开源项目! | 2022-06-20 |
| [风如歌](https://gitee.com/the-wind-is-like-a-song) | ¥ 10.0 | 这个框架简直满足了我所有对于安全框架的需求,赞一个,加油sa-token加油中国开源! | 2022-06-17 |
| [qiuyue](https://gitee.com/bmlt) | ¥ 10.0 | satoken牛逼 | 2022-06-16 |
| [刘时立](https://gitee.com/liu-shili) | ¥ 10.0 | 非常棒的开源项目! | 2022-06-13 |
| [yuncai929](https://gitee.com/null_448_5562) | ¥ 10.0 | 感谢您的开源项目! | 2022-06-10 |
| [sun_2020](https://gitee.com/sun-two-thousand-and-twenty) | ¥ 50.0 | 感谢您的开源项目! | 2022-06-08 |
| [LZ](https://gitee.com/FUNKBOY) | ¥ 6.66 | 感谢您的开源项目顺便踩一脚Spring Securitysa加油 | 2022-05-18 |
| [cray](https://gitee.com/hyy6300) | ¥ 10.0 | 感谢您的开源项目! | 2022-05-10 |
| [别处理](https://gitee.com/zshnb) | ¥ 10.0 | 非常好的项目,希望能一直做下去 | 2022-05-01 |
| [李洪星](https://gitee.com/li_hong_xing) | ¥ 10.0 | 解决了很多之前项目中遇到的问题。感谢您的开源项目! | 2022-04-29 |
| [乡村阿土哥](https://gitee.com/895995040) | ¥ 10.0 | 感谢您的开源项目! | 2022-04-29 |
| [Horatio201](https://gitee.com/horatio201) | ¥ 20.0 | 太牛了! | 2022-04-25 |
| [阿文](https://gitee.com/qq921124136) | ¥ 20.0 | 很好的框架,在开发文档里学到了很多知识点 | 2022-04-21 |
| 行长 (微信打赏) | ¥ 20.0 | 微信打赏 | 2022-04-15 |
| [xq584](https://gitee.com/xq584) | ¥ 10.0 | 感谢您的开源项目! | 2022-04-08 |
| [yukihane](https://gitee.com/yukihane) | ¥ 10.0 | 感谢您的开源项目! | 2022-04-07 |
| [alkinn](https://gitee.com/alkinn) | ¥ 10.0 | 感谢您的开源项目! | 2022-03-29 |
| [lele](https://gitee.com/lelez) | ¥ 10.0 | 感谢您的开源项目! | 2022-03-29 |
| Robin Tin (微信打赏) | ¥ 28.88 | 微信打赏 | 2022-03-24 |
| [刘嘉威](https://gitee.com/liu_jiawei) | ¥ 6.66 | 真滴好用~ | 2022-03-23 |
| 秦政 (微信打赏) | ¥ 20.00 | 微信打赏 | 2022-03-22 |
| 秦政 (微信打赏) | ¥ 6.66 | 微信打赏 | 2022-03-22 |
| 黎子豪 (微信打赏) | ¥ 18.88 | 请你喝杯咖啡 | 2022-03-21 |
| [Charles7c](https://gitee.com/Charles7c) | ¥ 20.0 | 感谢您的开源项目!希望 SSO 模块越来越好! | 2022-03-17 |
| [晓辉](https://gitee.com/zxhShow) | ¥ 10 | 感谢您的开源项目! | 2022-03-07 |
| [老杨](https://gitee.com/yangs914) | ¥ 6.66 | 感谢您的开源项目! | 2022-03-01 |
| 赵津 (微信打赏) | ¥ 16.00 | 微信打赏 | 2022-02-20 |
| [前世男友](https://gitee.com/lanbaba666) | ¥ 10 | 感谢您的开源项目! | 2022-02-17 |
| 两岁 (微信打赏) | ¥ 188 | 微信打赏 | 2021-12-27 |
| 刚子 (微信打赏) | ¥ 50 | 微信打赏 | 2021-12-27 |
| [网络小渣渣](https://gitee.com/a9777) | ¥ 10 | 感谢您的开源项目! | 2021-12-24 |
| [周周周杨](https://gitee.com/ChaoGeWanJiu) | ¥ 10 | 感谢您的开源项目! | 2021-12-18 |
| [MrXionGe](https://gitee.com/MrXionGe) | ¥ 10 | SA加油~~ | 2021-12-17 |
| [duyiliu](https://gitee.com/duyiliu) | ¥ 10 | 化繁为简,是门艺术。 | 2021-12-16 |
| [liu](https://gitee.com/liuliuliu123456) | ¥ 50 | 感谢您的开源项目! | 2021-12-15 |
| [fuhouyin](https://gitee.com/fuhouyin) | ¥ 10 | 感谢您的开源项目! | 2021-12-01 |
| [图灵谷](https://gitee.com/stephenson37) | ¥ 20 | 感谢您的开源项目! | 2021-11-30 |
| [luyuan](https://gitee.com/meitesi) | ¥ 20 | 感谢您的开源项目! | 2021-11-29 |
| [xiaoyan](https://gitee.com/l-yun) | ¥ 200 | 感谢您的开源项目! | 2021-11-26 |
| [yijunzhao](https://gitee.com/yijunzhao) | ¥ 20 | 感谢您的开源项目! | 2021-11-21 |
| [万声鹉](https://gitee.com/wanshengwu) | ¥ 10 | 感谢您的开源项目! | 2021-11-15 |
| [Taller](https://gitee.com/evilatom) | ¥ 10 | 感谢您的开源项目! | 2021-11-13 |
| [公子骏](https://gitee.com/dt_flys) | ¥ 20 | 感谢您的开源项目! | 2021-11-08 |
| [铂赛东](https://gitee.com/bryan31) | ¥ 20 | 开源加油! | 2021-11-08 |
| [孔孔的空空](https://gitee.com/kongmr) | ¥ 100 | 感谢您的开源项目! | 2021-11-02 |
| [songfazhun](https://gitee.com/fzsong) | ¥ 10 | 感谢您的开源项目! | 2021-10-28 |
| [ithorns](https://gitee.com/ithorns) | ¥ 10 | 感谢您的开源项目! | 2021-10-25 |
| [xiaoyan](https://gitee.com/l-yun) | ¥ 200 | 节日快乐 | 2021-10-24 |
| [apifox001](https://gitee.com/apifox001) | ¥ 200 | 开源不易Apifoxapifox.cn和你们一起加油 | 2021-10-15 |
| [永夜](https://gitee.com/cn-src) | ¥ 20 | 感谢您的开源项目! | 2021-09-18 |
| [苏永晓](https://gitee.com/suyongxiao) | ¥ 10 | 感谢您的开源项目! | 2021-09-01 |
| [xiaoyan](https://gitee.com/l-yun) | ¥ 200 | 好的作者理应被认可 | 2021-08-24 |
| [xiaoyan](https://gitee.com/l-yun) | ¥ 50 | be better | 2021-07-31 |
| [孔孔的空空](https://gitee.com/kongmr) | ¥ 500 | 感谢您的开源项目! | 2021-07-30 |
| [Wizzer](https://gitee.com/wizzer) | ¥ 20 | 感谢您的开源项目! | 2021-05-22 |
| [二范先生](https://gitee.com/mr-er-fan) | ¥ 20 | 省长加油啊 喝杯茶 | 2021-03-16 |
| [萧瑟](https://gitee.com/fengduidui) | ¥ 20 | 感谢您的开源项目! | 2021-03-16 |
| [xue1992wz](https://gitee.com/xue1992wz) | ¥ 20 | 感谢您的开源项目! | 2021-03-16 |
| [whcrow](https://gitee.com/whcrow) | ¥ 20 | 军师加油! | 2021-03-16 |
| [RockMan](https://gitee.com/njx33) | ¥ 10 | 感谢您的开源项目! | 2020-12-17 |
| [zhangjiaxiaozhuo](https://gitee.com/zhangjiaxiaozhuo)| ¥ 10 | 感谢您的开源项目! | 2020-12-15 |
| [知知](https://gitee.com/double_zhi) | ¥ 10 | 感谢您的开源项目! | 2020-12-15 |
| [省长](https://gitee.com/click33) | ¥ 10 | java中最好用的权限认证框架 | 2020-12-15 |
感谢每一位小伙伴的热心支持 ❤️ ❤️ ❤️

View File

@@ -0,0 +1,20 @@
# 公众号合作
---
### 推荐须知:
Sa-Token作为一个新兴项目迫切需要一定的途径进行项目推广<br>
如果您也是java公众号运营者欢迎您将Sa-Token框架推荐给您的粉丝
1. 您无需为Sa-Token专门撰写文案只需要复制项目仓库的 Readme 内容即可,可参考:[链接](https://mp.weixin.qq.com/s/xMCedNj6Nti2BwGzS9A0mg)
2. 在文章底部或内容中留下项目官网或者GitHub仓库链接
3. 文章需至少 1000+ 的阅读量
作为回报Sa-Token将
1. 在框架官方文档 [[推荐公众号]](/more/tj-gzh) 处留下您的公众号二维码(按照推荐日期倒叙排列)
2. 在框架官方交流群里@全体成员推广您的公众号一次
3. 您的公众号所有新推文章都可以将链接发送到Sa-Token交流群中增加阅读量为避免频繁推送连接请不要超过一周三次
<br>
如果您还有除公众号以外的其它途径可以与Sa-Token相互推荐欢迎加群交流……群链接在首页

225
sa-token-doc/more/tj-gzh.md Normal file
View File

@@ -0,0 +1,225 @@
# 推荐公众号
---
### Java技术公众号
<table class="gzh-table" style="text-align: center;">
<tr>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzU2MTI4MjI0MQ==&mid=2247508620&idx=1&sn=500448fce310a6012aa58616c304dec2&send_time="/>
<b>Java笔记虾</b>
<span>专注于Java技术栈推送 Spring全家桶Dubbo等相关技术知识</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzAxODcyNjEzNQ==&mid=2247541818&idx=2&sn=2b0e7190ed40fa07196de26be51bb432&send_time="/>
<b>程序猿DD</b>
<span>一线技术工作者的学习、生活与见闻</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzU5Mjc5NTIzMA==&mid=2247485007&idx=1&sn=d3bc0cc74a4efbc88b52cc5812c6573a&send_time="/>
<b>TJ君</b>
<span>一个励志推荐10000款开源项目与免费工具的程序猿</span>
</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=Mzg2OTA0Njk0OA==&mid=2247511204&idx=2&sn=e1c689f459474fcc1b8ee2ca20a52d3a&send_time="/>
<b>JavaGuide</b>
<span>专注Java后端学习和大厂面试的公众号</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzI3NzE0NjcwMg==&mid=2650166553&idx=3&sn=c8457e76c3fea17235fb7370cd2279d8&send_time="/>
<b>Hollis</b>
<span>《Java工程师成神之路》系列作者</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzU1Nzg4NjgyMw==&mid=2247493156&idx=1&sn=571db231d274a90ae9a47ac9c4f0a034&send_time="/>
<b>macrozheng</b>
<span>专注Java技术分享作者Github开源项目mall40K+Star</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzU2OTMyMTAxNA==&mid=2247496684&idx=2&sn=be1520743589ca43c129fde828af16ef&send_time="/>
<b>终码一生</b>
<span>分享Java开发技术JVM多线程高并发性能调优</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzU4ODI1MjA3NQ==&mid=2247502759&idx=2&sn=87ef078b86f5a0015d97807e76691b09&send_time="/>
<b>CodeSheep</b>
<span>一只爱技术的程序羊,想把分享变成一种习惯!</span>
</td>
</tr>
<tr>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzI4Njk5OTg1MA==&mid=2247489188&idx=1&sn=0098f458660d194817d4fc40bca55e4d&send_time="/>
<b>Java开发宝典</b>
<span>分享Java基础、Java框架、数据库、微服务、中间件、分布式、架构等技术干货</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzIwODkzOTc1MQ==&mid=2247489717&idx=1&sn=1c295f070123c84ee3791ac4d4898ae9&send_time="/>
<b>MarkerHub</b>
<span>专注于梳理java知识解析开源项目。 </span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzI3MDE0NzYwNA==&mid=2651444525&idx=3&sn=e266f94ada851a5ba6a61c1d71e9a62f&send_time="/>
<b>架构师必备</b>
<span>分享干货文章,做一个有逼格的架构师社区! </span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=Mzk0MjE5MTk5Mw==&mid=2247485576&idx=1&sn=d955d60ab193d895fbd15c37bedebcb8&send_time="/>
<b>Github导航站</b>
<span>分享好玩有趣、新奇、实用的开源项目 </span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzI1MTA3Mzk4Mg==&mid=2651026326&idx=1&sn=3244e18a9a799cd8e0ec375c6c730670&send_time="/>
<b>Java爱好者</b>
<span>分享Java开发编程资源和Java技术文章 </span>
</td>
</tr>
<tr>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzIxODQxMjc0MA==&mid=2247511029&idx=1&sn=42fbb1b8180dc2c995429dabc6f97500&send_time="/>
<b>IT大咖说</b>
<span>大咖干货,不再错过。 </span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzIxNjA5MTM2MA==&mid=2652444329&idx=1&sn=2a040e87f49a977a116c90e1107a9fdc&send_time="/>
<b>Java编程</b>
<span>专注Java技术分享Java基础知识/数据结构/算法</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzA4MDMyODg4OQ==&mid=2649482871&idx=2&sn=b376585faaf814d9072af539efda68fe&send_time="/>
<b>大侠学JAVA</b>
<span>道阻且长行则将至专注分享JAVA领域的干货</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=Mzg2MDIxNjAzNg==&mid=2247485810&idx=1&sn=afd46d5924afbc1030a87b5d56265fdf&send_time="/>
<b>Java大厂面试官</b>
<span>一名一直奋斗在一线的程序员, 记录工作用遇到的问题和解决方案</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzI2ODQwMTI0MA==&mid=2247486194&idx=2&sn=3fef462f77bdf0354a223e2e6d9d9136&send_time="/>
<b>程序员大神</b>
<span>有一个在程序员圈混了10年的老程序员, 分享程序员相关的精选内容教程</span>
</td>
</tr>
<tr>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzUyMDk4OTU5OA==&mid=2247499610&idx=6&sn=bc12403d060cba70be5739b808057d14&send_time="/>
<b>码农学习联盟</b>
<span>码农学习联盟程序员码农学习第一站Java、Python、大数据、机器学习、人工智能</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MjM5NzA1MTcyMA==&mid=2651175957&idx=3&sn=93343b003a8a3c2c600b909499cb554a&send_time="/>
<b>程序猿</b>
<span>传播编程经验,挖掘程序员优秀的学习资源。</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzI3MDE0NzYwNA==&mid=2651443022&idx=2&sn=65db50021c95493d2df03dc58f6dae49&send_time="/>
<b>架构师必备</b>
<span>分享干货文章,做一个有逼格的架构师社区!</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzI4MjI1MTI0Mw==&mid=2247493681&idx=1&sn=4257550a48bf3dfc5c312b0750171c61&send_time="/>
<b>GitHuboy</b>
<span>专注于分享 Python、Java、Web、AI、数据分析等多个领域的优质学习资源</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzA3NzA2MDMyNA==&mid=2650359032&idx=1&sn=79eea2f0cb16d5054bbb731885c310e5&send_time="/>
<b>开源最前线</b>
<span>推荐热门开源软件,介绍新开源项目,报导开源资讯!</span>
</td>
</tr>
<!-- <tr>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzUzNTY2NjAzMg==&mid=2247484321&idx=1&sn=52e7e5e0dc03437e94908b6a67985500&send_time="/>
<b>Dromara开源组织</b>
<span>Dromara开源组织官方公众号</span><br>
<a href="https://gitee.com/dromara" target="_blank">Gitee</a>
<a href="https://github.com/dromara" target="_blank">GitHub</a>
<a href="https://dromara.org/zh/projects/" target="_blank">官网</a>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzAxNjk4ODE4OQ==&mid=2247503088&idx=3&sn=f7e82b05d8f155b1fa79601393c437dc&send_time="/>
<b>方志朋</b>
<span>主要分享Java、Python等技术用大厂程序员的视角来探讨技术进阶、面试指南、职业规划等。</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzkyNzExODM3OA==&mid=2247485166&idx=1&sn=fe7ff42336d050a7fbbe6b06fdd8c3ec&send_time="/>
<b>Java仓库</b>
<span>专注Java全栈开发分享实用技术干货。</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzU3MDc3OTI1NA==&mid=2247490668&idx=1&sn=cd9efecdf1ac34cc8cac04902a9f8319&send_time="/>
<b>Java技术江湖</b>
<span>一位阿里 Java 工程师的技术小站, 分享技术干货和学习经验</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MjM5MTM0NjQ2MQ==&mid=2650152326&idx=2&sn=62643fd0987a56095663b12a2ec622c5&send_time="/>
<b>java那些事</b>
<span>分享java中各种新技术的应用方法做一个潮流的java技术人</span>
</td>
</tr>
<tr>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzIwNTk5NjEzNw==&mid=2247494012&idx=1&sn=378001dabae76b2df4de9a0dadf5842d&send_time="/>
<b>Java研发军团</b>
<span>Java系列文章个人博客MySQL、SSM、Redis、Spring</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzIwMTY0NDU3Nw==&mid=2651952104&idx=1&sn=315a840285b4f5b243d68e31cd0f2008&send_time="/>
<b>Java团长</b>
<span>分享些技术干货致力于Java全栈开发</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzAwMjk5Mjk3Mw==&mid=2247496042&idx=1&sn=3c246a6feea74d24b92d49b564509fe8&send_time="/>
<b>武哥聊编程</b>
<span>你若对得起时间,时间便对得起你~ 我是武哥!谢谢你的关注~每天进步一点点!</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzU2MTI4MjI0MQ==&mid=2247501218&idx=3&sn=599c40e5cd1acf597c8f392f1c5bd150&send_time="/>
<b>Java笔记虾</b>
<span>专注于Java技术栈推送 Spring全家桶DubboZookeeperRedisLinux多线程</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzI1MDQwMDE3MQ==&mid=2247489606&idx=1&sn=d215fce776c5f56fc439cfdc024de504&send_time="/>
<b>Java项目学习</b>
<span>关注我我来带你从零开始做Java项目</span>
</td>
</tr>
<tr>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000005&size=102&__biz=MzIwNjg4MzY4NA==&mid=2247490744&idx=2&sn=2cea21ce873cae0cc4a1c5097265e678&send_time="/>
<b>程序员追风</b>
<span>专注于分享Java各类学习笔记、面试题以及IT类资讯。</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzU2OTYxNjk0Mg==&mid=2247489042&idx=1&sn=3526217770b7ec0661dc53b18eb98500&send_time="/>
<b>程序员编程</b>
<span>每天下午1330分发文主要发布开源项目、面试题、最新技术资讯、干货学习资源</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzUzMDE4NjE4Mg==&mid=2247486739&idx=1&sn=339aed2b872c5c2f291e83b7ab107b4d&send_time="/>
<b>写代码的渣渣鹏</b>
<span>关注我学好Java。Spring Boot、 微服务、高并发、多线程、JVM、Spring Cloud</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzA3MzE4ODY0Mg==&mid=2455988316&idx=1&sn=6d70a967f1ff757cdda320472c1deb87&send_time="/>
<b>GitHub精选</b>
<span>专注于分享优质的开源项目、学习资源Java、Python、Go、Web 前端、AI、数据分析</span>
</td>
<td>
<img src="https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzA5MzYyNzQ0MQ==&mid=2247498873&idx=1&sn=8cb67e3057f81fc68ec5fd407076c7eb&send_time="/>
<b>HelloGitHub</b>
<span>分享 GitHub 上有趣、入门级的开源项目。</span>
</td>
</tr> -->
</table>
<br>
感谢以上公众号对 Sa-Token 项目的推荐如果您也是java公众号运营者欢迎 [相互推荐](/more/tj-gzh-hz)

View File

@@ -0,0 +1,433 @@
# 更新日志
### 2022-9-8 @v1.31.0
- 文档:新增优秀开源案例展示。
- 文档:新增博客展示,欢迎大家投稿。
- 新增:新增 `SaInterceptor` 综合拦截器。 **[重要]** **[不向下兼容]**
- 新增:新增 新增 `@SaIgnore` 忽略鉴权注解。 **[重要]**
- 新增:新增插件 `sa-token-dao-redis-fastjson`,感谢 `@sikadai` 提交的pr。 **[重要]**
- 新增:新增插件 `sa-token-context-grpc`,感谢 `@LiYiMing666` 提交的pr。 **[重要]**
- 重构SaSession 取消 `tokenSignList` 的 final 修饰符。
- 新增SaSession 添加 `setTokenSignList` 方法。
- 重构TokenSign 新增 `setValue``setDevice` 方法。
- 修复:修复多账号模式下不能正确重置 `StpLogic` 的问题。
- 修复:修复 SaSession 对象中 TokenSign 判断有可能空指针的问题。
- 修复:解决当权限码为 null 时可能带来的空指针问题。
- 新增:新增 `StpUtil.getExtra(tokenValue, key)` 方法,用于获取任意 token 的扩展参数。
- 优化:优化 `StpLogic#logoutByTokenValue` 方法逻辑,精简代码。
- 重构:`SaTokenConfig` 配置类字段 `isReadHead` 改为 `isReadHeader`**[不向下兼容]**
- 修复:修复部分场景下踢人下线会抛出异常 `非Web上下文无法获取Request` 的问题。
- 新增:新增方法 `StpLogic#getAnonTokenSession`,可在未登录情况下安全的获取 Token-Session。 **[重要]**
- 新增:新增 `SaApplication` 对象,用于全局作用域存取值。 **[重要]**
- 重构:将 `SaTokenListener` 改为事件发布订阅模式,允许同时注册多个侦听器。 **[重要]** **[不向下兼容]**
- 重构:**StpUtil.login(id) 不再强制校验账号是否禁用,需要手动校验。** **[不向下兼容]**
- 重构:`DisableLoginException` 更换名称为 `DisableServiceException`**[不向下兼容]**
- 新增:新增对账号限制、分类封禁、阶梯封禁功能。 **[重要]**
- 新增会话查询API增加反序获取会话方式。
- 新增SSO模块增加 server-url 属性,用于简化各种 url 配置。 **[重要]**
- 修复:修复单点登录模块 `ssoLogoutCall` 配置项无效的问题。
- 优化:优化 `SaSsoHandle.checkTicket(ticket, currUri);` 方法,使其不提供 currUri 参数时将不再注册单点注销回调。
- 修复:修复 `SaOAuth2Handle` 类中 `doLogin` 方法没有使用 `Param.pwd` 常量的问题。
- 新增:新增 `SaOAuth2Util.checkClientTokenScope(clientToken, scopes)` 方法,校验 Client-Token 是否含有指定 Scope。
- 删除:删除 `sa-token-jwt` 模块过期 class。
- 重构:`sa-token-jwt` 模块依赖改为 `hutool-jwt`,并升级版本为 5.8.5。
- 重构:`sa-token-jwt` 模块改为 `Util + Template` 形式,方便针对部分代码重写。 **[重要]**
- 新增在线文档添加API手册。
- 重构:`sa-token-oauth2` 模块密码模式新增 `client_secret` 参数校验。**[不向下兼容]**
- 新增:集成 `jacoco` 插件,核心包单元测试覆盖率提高至 90% 以上。
- 优化:开源案例分离专属仓库:[Awesome-Sa-Token](https://gitee.com/sa-token/awesome-sa-token)
### 2022-05-9 @v1.30.0
- 新增:新增集成 Web-Socket 鉴权示例。 **[重要]**
- 新增:新增集成 Web-SocketSpring封装版 鉴权示例。
- 新增:新增 jfinal 集成包 `sa-token-jfinal-plugin` **[重要]**
- 新增:新增 jboot 集成包 `sa-token-jboot-plugin` (感谢 @nxstv 提交的pr
- 修复:修复整合 sa-token-jwt Style 模式时,`StpUtil.getExtra("key")` 无效的bug
- 升级:升级 `sa-token-context-dubbo` dubbo版本`2.7.11` -> `2.7.15`
- 升级:借助 `flatten-maven-plugin` 统一版本号定义 (感谢 @ruansheng8 提交的pr **[重要]**
- 修复:修复在 `springboot 2.6.x``quick-login` 插件循环依赖无法启动的问题
- 优化:`sa-token-spring-aop` 依赖改为 `sa-token-core`避免在webflux环境下启动报错的问题
- 优化:源码注释 设备标识 改为 设备类型 更符合语义
- 修复:解决部分协议下 dubbo 参数变为小写导致 `Id-Token` 鉴权无效的问题
- 升级:单元测试升级为 JUnit5
- 新增:新增 `maxLoginCount` 配置,指定同一账号可同时在线的最大数量 **[重要]**
- 升级:彻底删除 SaTokenAction 接口,完全由 SaStrategy 代替
- 新增:新增 `sa-token-dao-redisx` 插件,感谢 @noear 提交的pr **[重要]**
- 优化:增加 parseToken 未配置 jwt 密钥时的异常提示,感谢 @BATTLEHAWK00 提交的pr
- 优化sso,oauth2 插件中调用配置类使用 getter 方法,感谢 @Naah 提交的pr
- 新增:新增 json 转换器模块
- 重构SaTokenListener#doLogin 方法新增 tokenValue 参数 **[不向下兼容]**
- 升级SpringBoot 相关组件依赖版本升级至 `2.5.12`
- 文档:在线文档所有 `AjaxJson` 改为 `SaResult`
- 文档:“多账号认证” -> 改为 “多账户认证”
- 文档:部分章节新增动态演示图 **[重要]**
- 升级:顶级异常类 `SaTokenException` 增加 code 异常细分状态码。[详见](/fun/exception-code) **[重要]**
- **注意升级:受异常细分状态码影响,`NotPermissionException` 类中 `getCode()` 方法改为 `getPermission()`。** **[不向下兼容]**
- SSO 模块升级:
- 重构SSO 模块从核心包拆分为独立插件 `sa-token-sso` **[重要]**
- 优化SSO模式三单点注销回调方法中注销语句改为`stpLogic.logout(loginId)` 更符合情景
- 修复:解决 sso 构建认证地址时,部分 Servlet 版本内部实现不一致带来的双 back 参数问题。
- 升级SSO 模块提供精细化异常处理
- 重构SSO 模式三接口 `/sso/checkTicket``/sso/logout`,更改响应体格式 **[不向下兼容]**
- 优化SSO 模式三单点注销搭建示例增加 `try-catch`,提高容错性
- 优化:`SsoUtil.singleLogout` 改为 `SsoUtil.ssoLogout`,且无需再提供 secretkey 参数 **[不向下兼容]**
- 升级:将 SSO 模式三的接口调用改为签名式校验。 **[重要]** **[不向下兼容]**
- 新增:新增 SSO 模式三下无 sdk 的对接示例, 感谢 @Sa-药水 的建议反馈 **[重要]**
- sa-token-jwt 模块升级:
- 重构:`sa-token-jwt` 的创建强制校验loginType **[不向下兼容]**
- 重构:`StpLogicJwtForStateless` 由重写 login 方法改为重写 createLoginSession
- 重构:`SaJwtUtil` 工具类不再吞并异常消息,且提供精细化异常 code 码。
- 重构改名StpLogicJwtForStyle -> StpLogicJwtForSimple
- 重构改名StpLogicJwtForMix -> StpLogicJwtForMixin
- 修复:修复 `StpLogicJwtForSimple` 模式下 Extra 数据可能受到旧 token 影响的bug
### 2022-02-10 @v1.29.0
- 升级sa-token-jwt插件可在登录时添加额外数据。
- 重构优化Dubbo调用时向下传递Token的规则可避免在项目启动时由于Context无效引发的bug。
- 重构OAuth2 授权模式开放由全局配置和Client单独配置共同设定。
- 重构OAuth2 模块部分属性支持每个 Client 单独配置。
- 重构OAuth2 模块部分方法名修复单词拼写错误converXxx -> convertXxx。
- 重构:修复 OAuth2 模块 `deleteAccessTokenIndex` 回收 token 不彻底的bug。
- 新增OAuth2 模块新增 `pastClientTokenTimeout`,用于指定 PastClientToken 默认有效期。
- 文档:常见报错章节增加目录树,方便查阅。
- 文档:优化文档样式。
- 新增:新增 BCrypt 加密。
- 修复修复StpUtil.getLoginIdByToken(token) 在部分场景下返回出错的bug。
- 重构优化OAuth2模块密码式校验步骤。
- 新增新增Jackson定制版Session避免timeout属性的序列化。
- 新增SaLoginModel新增setToken方法用于预定本次登录产生的Token。
- 新增:新增 StpUtil.createLoginSession() 方法用于无Token注入的方式创建登录会话。
- 新增OAuth2 与 StpUtil 登录会话数据互通。
- 新增:新增 `StpUtil.renewTimeout(100);` 方法,用于 Token 的 Timeout 值续期。
- 修复修复默认dao实现类中 `updateObject` 无效的bug
- 完善:完善单元测试。
### 2021-11-5 @v1.28.0
- 新增:新增 `sa-token-jwt` 插件用于与jwt的整合 **[重要]**
- 新增:新增 `sa-token-context-dubbo` 插件,用于与 Dubbo 的整合 **[重要]**
- 文档文档新增章节Sa-Token 插件开发指南 **[重要]**
- 文档:文档新增章节:名称解释
- 优化:抽离 `getSaTokenDao()` 方法,方便重写
- 新增:单元测试新增多账号模式数据不互通测试
- 优化:优化在线文档,修复部分错误之处
- 优化优化未登录异常抛出提示标注无效的Token值
- 修复:修复单词拼写错误 `getDeviceOrDefault`
- 优化:优化 jwt 集成示例
- 文档:新增常见问题总结
### 2021-10-11 @v1.27.0
- 升级:增强 SaRouter 链式匹配能力 **[重要]**
- 新增:新增插件 Thymeleaf 标签方言 **[重要]**
- 新增:@SaCheckPermission 增加 orRole 字段用于权限角色“双重or”匹配 **[重要]**
- 升级Cookie模式增加 `secure``httpOnly``sameSite`等属性的配置 **[重要]**
- 重构重构SSO三种模式抽离出统一的认证中心 **[重要]**
- 新增:新增 SaStrategy 策略类,方便内部逻辑按需重写 **[重要]**
- 新增:临时认证模块新增 deleteToken 方法用于回收 Token
- 新增:新增 kickout、replaced 等注销会话的方法,更灵活的控制会话周期 **[重要]**
- 新增权限认证增加API`StpUtil.hasPermissionAnd``StpUtil.hasPermissionOr`
- 新增角色认证增加API`StpUtil.hasRoleAnd``StpUtil.hasRoleOr`
- 新增:新增 `StpUtil.getRoleList()``StpUtil.getPermissionList()` 方法
- 新增:新增 StpLogic 自动注入特性,可快速方便的扩展 StpLogic 对象
- 优化:优化同端互斥登录逻辑,如果登录时没有指定设备类型标识,则默认顶替所有设备类型下线
- 优化:在未登录时调用 hasRole 和 hasPermission 不再抛出异常而是返回false
- 升级:升级注解鉴权算法,并提供更简单的重写方式
- 文档:新增常见报错排查,方便快速排查异常报错
- 文档文档新增SSO单点登录与OAuth2技术选型对比
- 破坏式更新:
- [向下兼容] 废弃 SaTokenAction 接口,替代方案: SaStrategy
- [向下兼容] 移除 `StpUtil.logoutByLoginId()` 更换为 `StpUtil.kickout()`;
- [不向下兼容] 侦听器 doLogoutByLoginId 与 doReplaced 方法移除 device 参数
- [不向下兼容] 侦听器 doLogoutByLoginId 方法重命名为 doKickout
### 2021-9-2 @v1.26.0
- 优化:优化单点登录文档
- 新增:新增 `Http Basic` 认证 **[重要]**
- 新增:文档新增跨域解决方案
- 文档:新增 Nginx 转发请求丢失uri的解决方案
- 文档:新增 SSO 自定义 API 路由示例 **[重要]**
- 示例:新增 `SSO-Server` 端前后端分离示例 **[重要]**
### 2021-8-16 @v1.25.0
- 新增:`SaRequest`新增`getHeader(name, defaultValue)`方法用于获取header默认值
- 新增:`SaRequest` 添加 `forward` 转发方法
- 新增Readme新增源码模块介绍、友情链接、正在使用Sa-Token的项目
- 重构重构SSO单点登录模块源码增加可读性
- 新增SSO配置表新增所属端说明
- 新增SSO模式三新增账号资料同步示例 **[重要]**
- 新增前后端分离模式下接入SSO的示例 **[重要]**
- 优化优化SSO单点注销重定向逻辑
- 重构重构SSO单点登录模块部分API
- 优化优化SaQuickBean中过滤器处理逻辑
- 文档:优化文档样式,增加示例
- 文档:代码鉴权、注解鉴权、路由拦截鉴权,选择指南
- 文档:文档新增 SSO旧有系统改造指南
- 文档SSO集成文档里添加API列表
- 文档:新增 `Sa-Token-Study` 链接,讲解 Sa-Token 源码涉及到的技术点
- 不兼容更新重构:
- 重构:修复 `SaReactorHolder.getContent()` 拼写错误:`content` -> `context`
### 2021-7-24 @v1.24.0
- 修复修复部分场景下Alone-Redis插件导致项目无法启动的问题
- 优化增加对SpringBoot1.x版本的兼容性
- 新增SaOAuth2Util新增checkScope函数用于校验令牌是否具备指定权限
- 新增OAuth2.0模块新增revoke接口用于提前回收 Access-Token 令牌
- 新增:新增`Sa-Id-Token` 模块,解决微服务内部调用鉴权 **[重要]**
- 文档新增OAuth2.0模块常用方法说明
- 优化:大幅度优化文档示例
### 2021-7-19 @v1.23.0
- 新增Sa-Token-OAuth2 模块正式发布 **[重要]**
- 修复修复jwt集成demo无法正确注册StpLogic的bug
- 修复修复登录时某些场景下Session续期可能不正常的bug
- 优化:代码注释优化,文档优化
### 2021-7-10 @v1.22.0
- 新增SaSsoConfig 部分属性增加set连缀风格
- 优化SaSsoUtil 可定制化底层的 `StpLogic`
- 新增:新增 `SaSsoHandle` 大幅度简化单点登录整合步骤 **[重要]**
- 新增新增Sa-Token在线测评链接[https://ks.wjx.top/vj/wFKPziD.aspx](https://ks.wjx.top/vj/wFKPziD.aspx) **[重要]**
- 新增Sa-Token-Quick-Login 插件新增拦截与放行路径配置
- 优化:大幅度优化文档示例
### 2021-7-2 @v1.21.0
- 新增新增Token二级认证 **[重要]**
- 新增:新增`Sa-Token-Alone-Redis`独立Redis插件 **[重要]**
- 新增新增SSO三种模式彻底解决所有场景下的单点登录问题 **[重要]**
- 新增:新增多账号模式下,注解合并示例 **[重要]**
- 新增:新增`SaRouter.back()`函数,用于停止匹配返回结果
- 不兼容更新重构:
- 更改yml配置前缀`[spring.sa-token.]` 改为 `[sa-token.]`,目前版本暂时向下兼容,请尽快更新
### 2021-6-17 @v1.20.0
- 新增新增Solon适配插件感谢大佬 `@刘西东` 提供的pr **[重要]**
- 新增:新增`SaRouter.stop()`函数,用于一次性跳出匹配链功能 **[重要]**
- 新增:新增单元测试 **[重要]**
- 新增:新增临时令牌验证模块 **[重要]**
- 新增:新增`sa-token-temp-jwt`模块整合jwt临时令牌鉴权 **[重要]**
- 新增:会话 `SaSession.get()` 增加缓存API简化代码
- 新增:新增框架调查问卷
- 修复:修复同时引入 `Spring Cloud Bus``Sa-Token` 冲突的问题 **[重要]**
- 修复:修复`SaServletFilter`异常函数中无法自定义`Content-Type`的问题
- 文档:新增微服务依赖引入说明
- 文档:新增认证流程图
- 不兼容更新重构:
- 方法:`StpUtil.setLoginId(id)` -> `StpUtil.login(id)`
- 方法:`StpUtil.getLoginKey()` -> `StpUtil.getLoginType()` (注意其它所有地方的`LoginKey`均已更改为`loginType`)
- 工具类:`SaRouterUtil` -> `SaRouter`
- 配置类:`allowConcurrentLogin` -> `isConcurrent`
- 配置类:`isV` -> `isPrint`
- 为保证平滑更新旧API仍旧保留但已增加`@Deprecated`注解请尽快更新至新API
### 2021-5-10 @v1.19.0
- 新增注解鉴权新增定制loginType功能 **[重要]**
- 重构:重构目录结构,抽离`plugin`模块 **[重要]**
- 新增:新增 `sa-token-quick-login` 插件,零代码集成登录功能 **[重要]**
- 优化:所有函数式接口增加`@FunctionalInterface`注解,感谢群友`@MrXionGe`提供的建议
- 优化:文档优化...
### 2021-4-24 @v1.18.0
- 新增:新增权限通配符功能,灵活设置权限 **[重要]**
- 修复:修复自动续签处的逻辑错误
- 新增新增Web开发常见漏洞防护建议
- 修复:修复`SaRequest`中缺少`getMethod()`的bug
- 修复:修复自动续签时的逻辑错误,感谢群成员`@N`的建议
- 新增:全局过滤器新增 `beforAuth` 前置函数
- 修复修复在带有上下文的项目中无法正确获取请求路径的bug感谢群成员`@dlwlrma`提供的建议
- 新增:新增`SaHolder`上下文持有类,可方便的在上下文中读写数据
- 重构:`SaTokenManager` -> `SaManager`
- 重构:`SaTokenInsideUtil` -> `SaFoxUtil`
### 2021-4-17 @v1.17.0
- 修复在WebFlux环境中引入Redis集成包无法启动的问题
- 修复修复JWT集成示例中版本升级API的变更
- 优化:优化启动时字符画打印
- 文档:新增集成环境说明
- 文档:新增功能介绍图
- 新增:全局过滤器增加限定[拦截路径]与[排除路径]功能
- 重构:全局过滤器执行函数放到成员变量里,连缀风格配置
- 新增新增全局侦听器可在用户登陆、注销、被踢下线等关键性操作时进行一些AOP操作 **[重要]**
### 2021-4-12 @v1.16.0
- 新增:新增账号封禁功能,指定时间内账号无法登陆 **[重要]**
- 新增:核心包脱离`ServletAPI`,彻底零依赖! **[重要]**
- 新增:新增基于`ThreadLocal`的上下文容器 **[重要]**
- 新增:新增`Reactor`响应式编程支持,`WebFlux`集成! **[重要]**
- 新增:新增全局过滤器,解决拦截器无法拦截静态资源的问题 **[重要]**
- 新增:新增微服务网关鉴权方案!可接入`ShenYu``Gateway`等网关组件! **[重要]**
- 新增AOP切面定义`Order`顺序为`-100`,可保证在多个自定义切面前执行
- 文档:新增推荐公众号列表
### 2021-3-23 @v1.15.0
- 新增:文档添加源码涉及技术栈说明
- 优化:优化路由拦截器模块文档,更简洁的示例
- 修复修复非web环境下的错误提示Request->Response
- 修复修复Cookie注入时path判断错误感谢@zhangzi0291提供的PR
- 新增文档集成Redis章节新增redis配置示例说明感谢群友 `@-)` 提供的建议
- 新增增加token前缀模式可在配置token读取前缀适配`Bearer token`规范 **[重要]**
- 优化:`SaTokenManager`初始化Bean去除`initXxx`方法,优化代码逻辑
- 新增:`SaTokenManager`新增`stpLogicMap`集合,记录所有`StpLogic`的初始化,方便查找
- 新增:`Session`新增timeout操作API可灵活修改Session的剩余有效时间
- 新增token前缀改为强制校验模式如果配置了前缀则前端提交token时必须带有
- 优化:精简`SaRouteInterceptor`,只保留自定义验证和默认的登陆验证,去除冗余功能
- 优化:`SaRouterUtil`迁移到core核心包优化依赖架构
- 优化默认Dao实现类里`Timer定时器`改为子线程 + sleep 模拟
- 新增:`Session`新增各种类型转换API可快速方便存取值 **[重要]**
- 升级注意:
- `SaRouterUtil`类迁移到核心包注意更换import地址
- `SaRouteInterceptor`去出冗余API详情参考路由鉴权部分
### 2021-3-12 @v1.14.0
- 新增:新增`SaLoginModel`登录参数Model适配 [记住我] 模式 **[重要]**
- 新增:新增 `StpUtil.login()` 时指定token有效期可灵活控制用户的一次登录免验证时长
- 新增新增Cookie时间判断`timeout`设置为-1时`Cookie`有效期将为`Integer.MAX_VALUE` **[重要]**
- 新增新增密码加密工具类可快速MD5、SHA1、SHA256、AES、RSA加密 **[重要]**
- 新增:新增 OAuth2.0 模块 **[重要]**
- 新增:`SaTokenConfig`配置类所有set方法支持链式调用
- 新增:`SaOAuth2Config` sa-token oauth2 配置类所有set方法新增支持链式调用
- 优化:`StpLogic`类所有`getKey`方法重名为`splicingKey`,更语义化的函数名称
- 新增:`IsRunFunction`新增`noExe`函数,用于指定当`isRun`值为`false`时执行的函数
- 新增:`SaSession`新增数据存取值操作API
- 优化:优化`SaTokenDao`接口增加Object操作API
- 优化jwt示例`createToken`方法去除默认秘钥判断,只在启动项目时打印警告
- 文档:常见问题新增示例(修改密码后如何立即掉线)
- 文档:权限认证文档新增[如何把权限精确搭到按钮级]示例说明
- 文档:优化文档,部分模块添加图片说明
### 2021-2-9 @v1.13.0
- 优化:优化源码注释与文档
- 新增文档集成Gitalk评论系统
- 优化:源码包`Maven`版本号更改为变量形式
- 修复:文档处方法名`getPermissionList`错误的bug
- 修复:修复`StpUtil.getTokenInfo()`会触发自动续签的bug
- 修复:修复接口 `SaTokenDao``searchData` 函数注释错误
- 新增:`SaSession`的创建抽象到`SaTokenAction`接口,方便按需重写
- 新建:框架内异常统一继承 `SaTokenException` 方便在异常处理时分辨处理
- 新增:`SaSession`新增`setId()``setCreateTime()`方法,方便部分框架的序列化
- 新增:新增`autoRenew`配置,用于控制是否打开自动续签模式
- 新增:同域模式下的单点登录 **[重要]**
- 新增:完善分布式会话的文档说明
### 2021-1-12 @v1.12.0
- 新增提供JWT集成示例 **[重要]**
- 新增:新增路由式鉴权,可方便的根据路由匹配鉴权 **[重要]**
- 新增:新增身份临时切换功能,可在一个代码段内将会话临时切换为其它账号 **[重要]**
- 优化:将`SaCheckInterceptor.java`更名为`SaAnnotationInterceptor.java`,更语义化的名称
- 优化:优化文档
- 升级v1.12.1,新增`SaRouterUtil`工具类,更方便的路由鉴权 **[重要]**
### 2021-1-10 @v1.11.0
- 新增提供AOP注解鉴权方案 **[重要]**
- 优化自动生成token的算法
### 2021-1-9 @v1.10.0
- 新增:提供查询所有会话方案 **[重要]**
- 修复修复token设置为永不过期时无法正常被顶下线的bug感谢github用户 @zjh599245299 提出的bug
### 2021-1-6 @v1.9.0
- 优化:`spring-boot-starter-data-redis``2.3.7.RELEASE` 改为 `2.3.3.RELEASE`
- 修复:补上注解拦截器里漏掉验证`@SaCheckRole`的bug
- 新增新增同端互斥登录像QQ一样手机电脑同时在线但是两个手机上互斥登录 **[重要]**
### 2021-1-2 @v1.8.0
- 优化:优化源码注释
- 修复:修复部分文档错别字
- 修复:修复项目文件夹名称错误
- 优化:优化文档配色,更舒服的代码展示
- 新增:提供`sa-token`集成 `redis``spring-boot-starter` 方案 **[重要]**
- 新增:新增集成 `redis` 时,以`jackson`作为序列化方案 **[重要]**
- 新增dao层默认实现增加定时清理过期数据功能 **[重要]**
- 新增:新增`token专属session`, 更灵活的会话管理 **[重要]**
- 新增:增加配置,指定在获取`token专属session`时是否必须登录
- 新增在无token时自动创建会话完美兼容`token-session`会话模型! **[重要]**
- 修改权限码限定必须为String类型
- 优化注解验证模式由boolean属性改为枚举方式
- 删除:`StpUtil`删除部分冗长API保持API清爽性
- 新增:新增角色验证 (角色验证与权限验证已完全分离) **[重要]**
- 优化:移除`StpUtil.kickoutByLoginId()`API`logoutByLoginId`代替
- 升级:开源协议修改为`Apache-2.0`
### 2020-12-24 @v1.7.0
- 优化项目架构改为maven多模块形式方便增加新模块 **[重要]**
- 优化:与`springboot`的集成改为`springboot-starter`模式,无需`@SaTokenSetup`注解即可完成自动装配 **[重要]**
- 新增:新增`activity-timeout`配置可控制token临时过期与续签功能 **[重要]**
- 新增:`timeout`过期时间新增-1值代表永不过期
- 新增:`StpUtil.getTokenInfo()`改为对象形式,新增部分常用字段
- 优化解决在无cookie模式下不集成redis时会话无法主动过期的问题
- 修复:修复文档首页样式问题
### 2020-12-17 @v1.6.0
- 新增花式token生成方案 **[重要]**
- 优化:优化`readme.md`
- 修复:修复`SaCookieOper``SaTokenAction`无法自动注入的问题
### 2020-12-16 @v1.5.1
- 新增细化未登录异常类型提供五种场景值未提供token、token无效、token已过期 、token已被顶下线、token已被踢下线 **[重要]**
- 修复:修复`StpUtil.getSessionByLoginId(String loginId)`方法转换key出错的bug感谢群友 @(#°Д°)、@一米阳光 发现的bug
- 优化:修改方法`StpUtil.getSessionByLoginId(Object loginId)`的isCreate值默认为true
- 修改:`方法delSaSession`修改为`deleteSaSession`,更加语义化的函数名称
- 新增:新增`StpUtil.getTokenName()`方法更语义化的获取tokenName
- 新增:新增`SaTokenAction`框架行为Bean方便重写逻辑
- 优化:`Cookie操作`改为接口代理模式,使其可以被重写
- 优化文档里集成redis部分增加redis的pom依赖示例
- 修复:登录验证-> `StpUtil.getLoginId_defaultNull()` 修复方法名错误的问题
- 优化:优化`readme.md`
- 升级:开源协议修改为`MIT`
### 2020-9-7 @v1.4.0
- 优化修改一些函数、变量名称使其更符合阿里java代码规范
- 优化:`tokenValue`的读取优先级改为:`request` > `body` > `header` > `cookie` **[重要]**
- 新增:新增`isReadCookie`配置,决定是否从`cookie`里读取`token`信息
- 优化:如果`isReadCookie`配置为`false`,那么在登录时也不会把`cookie`写入`cookie`
- 新增:新增`getSessionByLoginId(Object loginId, boolean isCreate)`方法
- 修复:修复文档部分错误,修正群号码
### 2020-5-2 @v1.3.0
- 新增:新增 `StpUtil.checkLogin()` 方法,更符合语义化的鉴权方法
- 新增:注册拦截器时可设置 `StpLogic` ,方便不同模块不同鉴权方式
- 新增:抛出异常时增加 `loginType` 区分,方便多账号体系鉴权处理
- 修复修复启动时的版本字符画版本号打印不对的bug
- 修复:修复文档部分不正确之处
- 新增:新增文档的友情链接
### 2020-3-7 @v1.2.0
- 新增:新增注解式验证,可在路由方法中使用注解进行权限验证 **[重要]**
- 参考:[注解式验证](use/at-check)
### 2020-2-12 @v1.1.0
- 修复:修复`StpUtil.getLoginId(T defaultValue)`取值转换错误的bug
### 2020-2-4 @v1.0.0
- 第一个版本出炉