官网:Sa-Token
本文内容主要都来源于官网
介绍
Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证
、权限认证
、Session会话
、单点登录
、OAuth2.0
、微服务网关鉴权
等一系列权限相关问题。
特点
- 调用接口简单
- 功能强大
- 基本都是一句话解决问题,和shiro,SpringSecurity比起来,简单到不像话
功能
- 登录认证 —— 单端登录、多端登录、同端互斥登录、七天内免登录
- 权限认证 —— 权限认证、角色认证、会话二级认证
- Session会话 —— 全端共享Session、单端独享Session、自定义Session
- 踢人下线 —— 根据账号id踢人下线、根据Token值踢人下线
- 账号封禁 —— 指定天数封禁、永久封禁、设定解封时间
- 持久层扩展 —— 可集成Redis、Memcached等专业缓存中间件,重启数据不丢失
- 分布式会话 —— 提供jwt集成、共享数据中心两种分布式会话方案
- 微服务网关鉴权 —— 适配Gateway、ShenYu、Zuul等常见网关的路由拦截认证
- 单点登录 —— 内置三种单点登录模式:无论是否跨域、是否共享Redis,都可以搞定
- OAuth2.0认证 —— 基于RFC-6749标准编写,OAuth2.0标准流程的授权认证,支持openid模式
- 二级认证 —— 在已登录的基础上再次认证,保证安全性
- Basic认证 —— 一行代码接入 Http Basic 认证
- 独立Redis —— 将权限缓存与业务缓存分离
- 临时Token验证 —— 解决短时间的Token授权问题
- 模拟他人账号 —— 实时操作任意用户状态数据
- 临时身份切换 —— 将会话身份临时切换为其它账号
- 前后台分离 —— APP、小程序等不支持Cookie的终端
- 同端互斥登录 —— 像QQ一样手机电脑同时在线,但是两个手机上互斥登录
- 多账号认证体系 —— 比如一个商城项目的user表和admin表分开鉴权
- 花式token生成 —— 内置六种Token风格,还可:自定义Token生成策略、自定义Token前缀
- 注解式鉴权 —— 优雅的将鉴权与业务代码分离
- 路由拦截式鉴权 —— 根据路由拦截鉴权,可适配restful模式
- 自动续签 —— 提供两种Token过期策略,灵活搭配使用,还可自动续签
- 会话治理 —— 提供方便灵活的会话查询接口
- 记住我模式 —— 适配[记住我]模式,重启浏览器免验证
- 密码加密 —— 提供密码加密模块,可快速MD5、SHA1、SHA256、AES、RSA加密
- 全局侦听器 —— 在用户登陆、注销、被踢下线等关键性操作时进行一些AOP操作
- 开箱即用 —— 提供SpringMVC、WebFlux等常见web框架starter集成包,真正的开箱即用
安装
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.29.0</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dao-redis-jackson</artifactId>
<version>1.29.0</version>
</dependency>
<!-- 提供Redis连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
sa-token:
# token名称 (同时也是cookie名称)
token-name: satoken
# token有效期,单位s 默认30天, -1代表永不过期
timeout: 2592000
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
activity-timeout: -1
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: false
# token风格
token-style: uuid
# 是否输出操作日志
is-log: false
session模型
use-session:
- Sa-Token只在调用StpUtil.login(id)登录会话时才会产生Session,不会为每个陌生会话都产生Session,节省性能
- 在登录时产生的Session,是分配给账号id的,而不是分配给指定客户端的,也就是说在PC、APP上登录的同一账号所得到的Session也是同一个,所以两端可以非常轻松的同步数据
- Sa-Token支持Cookie、Header、body三个途径提交Token,而不是仅限于Cookie
由于不强依赖Cookie,所以只要将Token存储到不同的地方,便可以做到一个客户端同时登录多个账号 -
// 获取当前会话的 User-Session SaSession session = StpUtil.getSession();
token-session:
- 两个设备登录的是同一账号,但是两个它们得到的token是不一样的, Sa-Token针对会话登录,不仅为账号id分配了User-Session,同时还为每个token分配了不同的Token-Session
- 不同的设备端,哪怕登录了同一账号,只要它们得到的token不一致,它们对应的
Token-Session
就不一致,这就为我们不同端的独立数据读写提供了支持 -
// 获取当前会话的 Token-Session SaSession session = StpUtil.getTokenSession();
customer-session:
-
自定义Session,Custom-Session不依赖特定的 账号id 或者 token,而是依赖于你提供的SessionId:
-
// 获取指定key的 Custom-Session SaSession session = SaSessionCustomUtil.getSessionById("goods-10001");
几种操作
登陆
//按照用户id登陆
StpUtil.login(userId);
//按照用户id和设备
StpUtil.login(userId, device);
//获取登陆id
StpUtil.getLoginId();
登出,注销,踢人下线,账号封禁
// 当前会话注销登录
StpUtil.logout();
StpUtil.logout(10001); // 强制指定账号注销下线
StpUtil.logout(10001, "PC"); // 强制指定账号指定端注销下线
StpUtil.logoutByTokenValue("token"); // 强制指定 Token 注销下线
StpUtil.kickout(10001); // 将指定账号踢下线
StpUtil.kickout(10001, "PC"); // 将指定账号指定端踢下线
StpUtil.kickoutByTokenValue("token"); // 将指定 Token 踢下线
// 封禁指定账号
// 参数一:账号id
// 参数二:封禁时长,单位:秒 (86400秒=1天,此值为-1时,代表永久封禁)
StpUtil.disable(10001, 86400);
// 获取指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
StpUtil.isDisable(10001);
// 获取指定账号剩余封禁时间,单位:秒
StpUtil.getDisableTime(10001);
// 解除封禁
StpUtil.untieDisable(10001);
token
//token
//获取当前token
StpUtil.getTokenValue();
StpUtil.getTokenInfo();
session
//session
//获取用户session
StpUtil.getSession()
//获取tokensession
StpUtil.getTokenSession();
//通过token获取tokensession
StpUtil.getTokenSessionByToken(token);
//获取customer-session
SaSessionCustomUtil.getSessionById("goods-10001");
//获取用户的所有token
List<TokenSign> list = StpUtil.getSessionByLoginId(userId).getTokenSignList();
其他:
看官网文档吧。