- 什么是SaToken?
Sa-Token是一个轻量级Java权限认证框架,官网地址:https://sa-token.cc/ ,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。
- SaToken功能
Sa-Token目前主要五大功能模块:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。

- 使用配置
在pom.xml文件引入对应依赖:
1 2 3 4 5 6
| <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-spring-boot-starter</artifactId> <version>1.39.0</version> </dependency>
|
在application.yml中填写相关配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ############## Sa-Token 配置 (文档: https://sa-token.cc) ############## sa-token: # token 名称(同时也是 cookie 名称) token-name: satoken # token 有效期(单位:秒) 默认30天,-1 代表永久有效 timeout: 2592000 # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 active-timeout: -1 # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录) is-concurrent: true # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) is-share: true # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) token-style: uuid # 是否输出操作日志 is-log: true
|
- 自定义 Token 生成风格与请求格式
在 SaToken 中,Token 风格可以通过 sa-token.token-style 配置项来定制,默认的生成策略是 uuid 风格,值类似于 623368f0-ae5e-4475-a53f-93e4225f16ae
SaToken 内置支持的风格有多种,大致如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| / 1. token-style=uuid —— uuid风格 (默认风格) "623368f0-ae5e-4475-a53f-93e4225f16ae"
// 2. token-style=simple-uuid —— 同上,uuid风格, 只不过去掉了中划线 "6fd4221395024b5f87edd34bc3258ee8"
// 3. token-style=random-32 —— 随机32位字符串 "qEjyPsEA1Bkc9dr8YP6okFr5umCZNR6W"
// 4. token-style=random-64 —— 随机64位字符串 "v4ueNLEpPwMtmOPMBtOOeIQsvP8z9gkMgIVibTUVjkrNrlfra5CGwQkViDjO8jcc"
// 5. token-style=random-128 —— 随机128位字符串 "nojYPmcEtrFEaN0Otpssa8I8jpk8FO53UcMZkCP9qyoHaDbKS6dxoRPky9c6QlftQ0pdzxRGXsKZmUSrPeZBOD6kJFfmfgiRyUmYWcj4WU4SSP2ilakWN1HYnIuX0Olj"
// 6. token-style=tik —— tik风格 "gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__"
|
- 自定义Token请求风格
比较通用、规范的 Token 请求格式:
Authorization = Bearer + 空格 + 令牌值
修改SaToken配置:
1 2 3 4 5
| sa-token: token-name: Authorization token-prefix: Bearer
|
存在问题
在我们已经将 SaToken 权限认证框架整合进了项目。但是有个问题,当调用 TestController 中的登录接口 /user/doLogin?username=zhang&password=123456 ,登录成功后再重启项目,调用 /user/isLogin 接口,验证一下用户是否登录的时候,会发现登录已经失效了。
登录失效的原因?
Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且避免了序列化与反序列化带来的性能消耗,但是此模式也有一些缺点,比如:
解决方案
为此,Sa-Token 提供了扩展接口,你可以轻松将会话数据存储在一些专业的缓存中间件上(比如 Redis), 做到重启数据不丢失,而且保证分布式环境下多节点的会话一致性。
项目pom.xml引入依赖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-redis-jackson</artifactId> <version>${sa-token.version}</version> </dependency>
<dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-redis-jackson</artifactId> </dependency>
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>
|