官网: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();

其他:

看官网文档吧。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐