Sa-TokenSa-Token
主题
首页文档博客
视频
乐之者java(登录认证/权限管理/apiKey等)抓蛙师(23集)朱老师的小课堂(7集)王清江唷 SSO篇(29集)fox说技术(7集)架构驿站(11集)王清江唷(99集)筑梦信仰-joy(20集)达达-Java(26集)晒太阳的盐(22集)[ + 课程提交 ]
案例
Gitee - Awesome-Sa-TokenGitHub - Awesome-Sa-TokenAtomGit - Awesome-Sa-Token
加群需求提交赞助🔥 SSO/OAuth2 商业版
安全推荐
开发者安全 ChecklistAPI 安全 Checklist腾讯代码安全指南Web 安全学习笔记OWASP Cheat Sheet SeriesPayloadsAllTheThings
相关资源
更新日志常见报错推荐公众号在线考试在线提问问卷调查
  • 开始

    • 框架介绍
    • 在 SpringBoot 环境集成
    • 在 WebFlux 环境集成
    • 在 Solon 环境集成
    • 其它环境集成示例
    • 源码运行指南
    • Sa-Token 集成示例大全下载
  • 基础

    • 登录认证
    • 权限认证
    • 踢人下线
    • 注解鉴权
    • 路由拦截鉴权
    • Session会话
    • 框架配置
  • 深入

    • 集成 Redis
    • 前后端分离
    • 自定义 Token 风格
    • Token 提交前缀
    • 同端互斥登录
    • 记住我模式
    • 登录参数 & 注销参数
    • 二级认证
    • 模拟他人 & 身份切换
    • 账号封禁
    • 密码加密
    • 会话查询
    • Http Basic/Digest 认证
    • 全局侦听器
    • 全局过滤器
    • 多账号认证
  • 单点登录

    • 单点登录简述
    • 搭建统一认证中心:SSO-Server
    • SSO-Server 认证中心开放 API 接口
    • SSO模式一 共享Cookie同步会话
    • SSO模式二 URL重定向传播会话
    • SSO模式三 Http请求获取会话
    • 配置域名校验
    • 定制化登录页面
    • 自定义API路由
    • 平台中心跳转模式
    • 匿名 client 接入
    • 单点注销
    • 前后端分离下的整合方案
    • 消息推送机制
    • 用户数据同步 / 迁移
    • NoSdk、ReSdk 模式与非 java 项目
    • SSO 代码 API 参考
    • 常见问题总结
    • Sa-Pro:单点登录商业版
  • OAuth2.0

    • OAuth2.0简述
    • OAuth2-Server搭建
    • OAuth2-Server端开放 API 接口
    • 自定义数据加载器
    • 配置 client 域名校验
    • 自定义 Scope 权限及处理器
    • 为 Scope 划分等级
    • 自定义 grant_type
    • 定制化登录页面与授权页面
    • 自定义 API 路由
    • OAuth2-Server端前后台分离
    • OpenId 与 UnionId
    • 开启 OIDC 协议
    • 使用注解校验 Access-Token
    • OAuth2-与登录会话实现数据互通
    • OAuth2 代码 API 参考
    • 常见问题总结
    • Sa-Max:统一认证商业版
  • 微服务

    • 分布式Session会话
    • 网关统一鉴权
    • 内部服务外网隔离
    • 依赖引入说明
  • 插件

    • AOP注解鉴权
    • 临时 Token 认证
    • Quick-Login快速登录插件
    • Alone独立Redis插件
    • Alone独立Redisson插件
    • 缓存层扩展
    • JSON 序列化扩展
    • 序列化插件扩展包
    • HTTP 请求扩展
    • 和 Thymeleaf 集成
    • 和 Freemarker 集成
    • 注解鉴权 SpEL 表达式
    • 和 jwt 集成
    • 和 Dubbo 集成
    • 和 gRPC 集成
    • API 接口参数签名
    • API Key 接口调用秘钥
    • Sa-Token 插件开发指南
    • 自定义 SaTokenContext 指南
  • API手册

    • StpUtil-鉴权工具类
    • SaSession-会话对象
    • SaTokenDao-数据持久接口
    • SaStrategy-全局策略
    • 全局类、方法
  • 框架设计

    • 仓库目录
    • 数据结构
  • 其它

    • 更新日志
    • 框架生态
    • 框架博客
    • 推荐公众号
    • 加入讨论群
    • Sa-Token 内容合作群
    • 赞助 Sa-Token
    • 需求提交
    • 问卷调查
  • 附录

    • 常见问题排查
    • 框架名词解释
    • Sa-Token功能结构图
    • 全局 Log 输出
    • 异步 & Mock 上下文
    • 未登录场景值详解
    • Token有效期详解
    • Session模型详解
    • 数据读写三大作用域
    • TokenInfo参数详解
    • 异常细分状态码
    • 自定义注解
    • 防火墙
    • 参考:把权限放在缓存里
    • 参考:把路由拦截鉴权动态化
    • 解决反向代理 uri 丢失的问题
    • 解决跨域问题
    • 技术选型:SSO 与 OAuth2 对比
    • 集成 MongoDB 参考一
    • 集成 MongoDB 参考二
    • 从 Shiro、SpringSecurity、JWT 迁移
    • issue 提问模板
    • 为Sa-Token贡献代码
    • Sa-Token开源大事记
    • 团队成员
    • Sa-Token框架掌握度--在线考试







----- 到底线了 -----

×

一个项目搞定:同域、跨域、共享Redis、跨Redis、前后端一体、前后端分离、纯 js、vue2、vue3、非 Sa-Token 项目、非 java 项目等架构下的 SSO 认证需求。

一次购买,永久授权。全源码交付,不含密 Jar。提供售后技术支持。

StpUtil - 鉴权工具类 ​

StpUtil 是 Sa-Token 整体功能的核心,大多数功能均由此工具类提供。


1、常规操作 ​

java
StpUtil.getStpLogic();   // 获取底层 StpLogic 对象。
StpUtil.setStpLogic(newStpLogic);   // 安全的重置底层 StpLogic 引用。
StpUtil.getLoginType();   // 获取账号类型 (例如:login、user、admin、teacher、student等等)。
StpUtil.getTokenName();   // 获取 Token 的名称 
StpUtil.getTokenValue();   // 获取本次请求前端提交的 Token。
StpUtil.getTokenValueNotCut();   // 获取本次请求前端提交的 Token (不裁剪前缀) 。
StpUtil.setTokenValue(tokenValue);   // 在当前会话中写入 Token 值。
StpUtil.setTokenValue(tokenValue, timeout);   // 在当前会话中写入 Token 值,并指定 Cookie 有效期。
StpUtil.setTokenValue(tokenValue, loginParameter);   // 在当前会话中写入 Token 值,并指定登录参数。
StpUtil.setTokenValueToStorage(tokenValue);   // 将 Token 写入当前请求的 Storage 存储器。
StpUtil.getTokenInfo();   // 获取当前 Token 的详细参数。
StpUtil.createSaLoginParameter();   // 根据当前配置对象创建一个 SaLoginParameter 对象
1
2
3
4
5
6
7
8
9
10
11
12

2、登录相关 ​

java
StpUtil.login(10001);   // 会话登录
StpUtil.login(10001, "APP");   // 会话登录,并指定设备类型
StpUtil.login(10001, true);   // 会话登录,并指定是否 [记住我]
StpUtil.login(10001, 86400);   // 会话登录,并指定此次 token 有效期(单位:秒)
StpUtil.login(10001, loginParameter);   // 会话登录,并指定所有登录参数Model
StpUtil.createLoginSession(10001);   // 创建指定账号id的登录会话,此方法不会将 Token 注入到上下文 
StpUtil.createLoginSession(10001, loginParameter);   // 创建指定账号id的登录会话,此方法不会将 Token 注入到上下文 
StpUtil.getOrCreateLoginSession(10001);   // 获取指定账号的登录会话,若不存在则创建并返回
1
2
3
4
5
6
7
8

更多 SaLoginParameter 登录参数的用法与示例,请参考 登录参数示例章节。

3、注销相关 ​

java
StpUtil.logout();   // 会话注销 
StpUtil.logout(logoutParameter);   // 会话注销,根据注销参数
StpUtil.logout(10001);   // 会话注销,根据账号id
StpUtil.logout(10001, "PC");   // 会话注销,根据账号id 和 设备类型
StpUtil.logout(10001, logoutParameter);   // 会话注销,根据账号id 和 注销参数
StpUtil.logoutByTokenValue(token);   // 指定 Token 强制注销
StpUtil.logoutByTokenValue(token, logoutParameter);   // 指定 Token 强制注销,带注销参数
StpUtil.kickout(10001);   // 踢人下线,根据账号id
StpUtil.kickout(10001, "PC");   // 踢人下线,根据账号id 和 设备类型
StpUtil.kickout(10001, logoutParameter);   // 踢人下线,根据账号id 和 注销参数
StpUtil.kickoutByTokenValue(token);   // 踢人下线,根据token
StpUtil.kickoutByTokenValue(token, logoutParameter);   // 踢人下线,根据token,带注销参数
StpUtil.replacedByTokenValue(token);   // 顶人下线,根据token
StpUtil.replacedByTokenValue(token, logoutParameter);   // 顶人下线,根据token,带注销参数
StpUtil.replaced(10001);   // 顶人下线,根据账号id
StpUtil.replaced(10001, "PC");   // 顶人下线,根据账号id 和 设备类型
StpUtil.replaced(10001, logoutParameter);   // 顶人下线,根据账号id 和 注销参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

更多 SaLogoutParameter 注销参数的用法与示例,请参考 注销参数示例章节。

4、会话查询 ​

java
StpUtil.isLogin();   // 当前会话是否已经登录 
StpUtil.isLogin(10001);   // 判断指定账号是否已登录
StpUtil.checkLogin();   // 检验当前会话是否已经登录,如未登录,则抛出异常
StpUtil.getLoginId();   // 获取当前会话账号id, 如果未登录,则抛出异常 
StpUtil.getLoginId(defaultValue);   // 获取当前会话账号id, 如果未登录,则返回默认值 
StpUtil.getLoginIdDefaultNull();   // 获取当前会话账号id, 如果未登录,则返回null 
StpUtil.getLoginIdAsString();   // 获取当前会话账号id, 并转换为String类型
StpUtil.getLoginIdAsInt();   // 获取当前会话账号id, 并转换为int类型
StpUtil.getLoginIdAsLong();   // 获取当前会话账号id, 并转换为long类型 
StpUtil.getLoginIdByToken(token);   // 获取指定 Token 对应的账号 id,若 token 无效/被踢/被顶/被冻结则返回 null 
StpUtil.getLoginIdByTokenNotThinkFreeze(token);   // 获取指定Token对应的账号id(不考虑冻结状态),如果未登录,则返回 null 
StpUtil.getExtra(key);   // 获取当前 Token 的扩展信息(此函数只在jwt模式下生效)
StpUtil.getExtra(token, key);   // 获取指定 Token 的扩展信息(此函数只在jwt模式下生效)
1
2
3
4
5
6
7
8
9
10
11
12
13

5、Session 相关 ​

java
// Account-Session 相关 
StpUtil.getSession();   // 获取当前会话的Session,如果Session尚未创建,则新建并返回 
StpUtil.getSession(true);   // 获取当前会话的Session, 如果Session尚未创建,isCreate=是否新建并返回
StpUtil.getSessionByLoginId(10001);   // 获取指定账号id的Session,如果Session尚未创建,则新建并返回
StpUtil.getSessionByLoginId(10001, true);   // 获取指定账号id的Session, 如果Session尚未创建,isCreate=是否新建并返回

// Token-Session 相关 
StpUtil.getTokenSession();   // 获取当前 Token-Session,如果 Session 尚未创建,则新建并返回 
StpUtil.getTokenSessionByToken(token);   // 获取指定Token-Session,如果Session尚未创建,则新建并返回
StpUtil.getAnonTokenSession();   // 获取当前匿名 Token-Session (可在未登录情况下使用的Token-Session)

// 其它
StpUtil.getSessionBySessionId("xxxx-xxxx-xxxx");   // 获取指定 sessionId 的 Session,若不存在则返回 null
StpUtil.isTrustDeviceId(123456, "xxxxxxxxxxxxxxxxxxxxxxxx");   // 判断对于指定 loginId 来讲,指定设备 id 是否为可信任设备
1
2
3
4
5
6
7
8
9
10
11
12
13
14

6、Token有效期相关 ​

java
// Token 最低活跃频率
StpUtil.getTokenActiveTimeout();   // 获取当前 token 距离被冻结还剩多少时间 (单位: 秒)
StpUtil.getTokenLastActiveTime();  // 获取当前 token 最后活跃时间
StpUtil.checkActiveTimeout();   // 检查当前token 是否已经被冻结,如果是则抛出异常  
StpUtil.updateLastActiveToNow();   // 续签当前token:(将 [最后操作时间] 更新为当前时间戳)   

// Token 有效期
StpUtil.getTokenTimeout();   // 获取当前登录者的 token 剩余有效时间 (单位: 秒)
StpUtil.getTokenTimeout(token);   // 获取指定 token 的剩余有效时间 (单位: 秒)
StpUtil.getSessionTimeout();   // 获取当前登录者的 Account-Session 剩余有效时间 (单位: 秒)
StpUtil.getTokenSessionTimeout();   // 获取当前 Token-Session 剩余有效时间 (单位: 秒) 
StpUtil.renewTimeout(timeout);   // 对当前 Token 的 timeout 值进行续期 
StpUtil.renewTimeout(token, timeout);   // 对指定 Token 的 timeout 值进行续期
1
2
3
4
5
6
7
8
9
10
11
12
13

7、角色认证 ​

java
StpUtil.getRoleList();   // 获取:当前账号的角色集合
StpUtil.getRoleList(10001);   // 获取:指定账号的角色集合 
StpUtil.hasRole(role);   // 判断:当前账号是否拥有指定角色, 返回true或false 
StpUtil.hasRole(loginId, role);   // 判断:指定账号是否含有指定角色标识, 返回true或false 
StpUtil.hasRoleAnd(...roleArray);   // 判断:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] 
StpUtil.hasRoleOr(...roleArray);   // 判断:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可] 
StpUtil.checkRole(role);   // 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException 
StpUtil.checkRoleAnd(...roleArray);   // 校验:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] 
StpUtil.checkRoleOr(...roleArray);   // 校验:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可]
1
2
3
4
5
6
7
8
9

8、权限认证 ​

java
StpUtil.getPermissionList();   // 获取:当前账号的权限集合
StpUtil.getPermissionList(10001);   // 获取:指定账号的权限集合 
StpUtil.hasPermission(permission);   // 判断:当前账号是否拥有指定权限, 返回true或false 
StpUtil.hasPermission(loginId, permission);   // 判断:指定账号是否含有指定权限标识, 返回true或false 
StpUtil.hasPermissionAnd(...permissionArray);   // 判断:当前账号是否含有指定权限标识 [指定多个,必须全部验证通过] 
StpUtil.hasPermissionOr(...permissionArray);   // 判断:当前账号是否含有指定权限标识 [指定多个,只要其一验证通过即可] 
StpUtil.checkPermission(permission);   // 校验:当前账号是否含有指定权限标识, 如果验证未通过,则抛出异常: NotPermissionException 
StpUtil.checkPermissionAnd(...permissionArray);   // 校验:当前账号是否含有指定权限标识 [指定多个,必须全部验证通过] 
StpUtil.checkPermissionOr(...permissionArray);   // 校验:当前账号是否含有指定权限标识 [指定多个,只要其一验证通过即可]
1
2
3
4
5
6
7
8
9

9、id 反查 Token ​

java
StpUtil.getTokenValueByLoginId(10001);   // 获取指定账号id的tokenValue 
StpUtil.getTokenValueByLoginId(10001, "PC");   // 获取指定账号id指定设备类型端的tokenValue
StpUtil.getTokenValueListByLoginId(10001);   // 获取指定账号id的tokenValue集合 
StpUtil.getTokenValueListByLoginId(10001, "APP");   // 获取指定账号id指定设备类型端的tokenValue 集合 
StpUtil.getTerminalListByLoginId(10001);   // 获取指定账号 id 已登录设备信息集合
StpUtil.getTerminalListByLoginId(10001, "PC");   // 获取指定账号 id 指定设备类型端的已登录设备信息集合
StpUtil.forEachTerminalList(10001, (session, terminal) -> {});   // 遍历指定账号的已登录设备列表
StpUtil.getTerminalInfo();   // 获取当前会话的终端信息
StpUtil.getTerminalInfoByToken(token);   // 获取指定 token 的终端信息
StpUtil.getLoginDeviceId();   // 返回当前会话的登录设备 id
StpUtil.getLoginDeviceIdByToken(token);   // 返回指定 token 的登录设备 id
StpUtil.getLoginDeviceType();   // 返回当前会话的登录设备类型
StpUtil.getLoginDeviceTypeByToken(token);   // 返回指定 token 的登录设备类型
1
2
3
4
5
6
7
8
9
10
11
12
13

10、会话管理 ​

java
StpUtil.searchTokenValue(keyword, start, size, sortType);   // 根据条件查询Token
StpUtil.searchSessionId(keyword, start, size, sortType);   // 根据条件查询SessionId 
StpUtil.searchTokenSessionId(keyword, start, size, sortType);   // 根据条件查询Token专属Session的Id
1
2
3

详细可参考:会话治理

11、账号封禁 ​

java
StpUtil.disable(10001, 1200);   // 封禁:指定账号 指定时间(单位s)
StpUtil.isDisable(10001);   // 判断:指定账号是否已被封禁 (true=已被封禁, false=未被封禁) 
StpUtil.checkDisable(10001);   // 校验:指定账号是否已被封禁,如果被封禁则抛出异常 `DisableServiceException`
StpUtil.getDisableTime(10001);   // 获取:指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
StpUtil.untieDisable(loginId);   // 解封:指定账号
1
2
3
4
5

12、分类封禁 (version >= 1.31.0) ​

java
StpUtil.disable(10001, "<业务标识>", 86400);   // 封禁:指定账号的指定服务 指定时间(单位s)
StpUtil.isDisable(10001, "<业务标识>");   // 判断:指定账号的指定服务 是否已被封禁 (true=已被封禁, false=未被封禁) 
StpUtil.checkDisable(10001, "<业务标识>");   // 校验:指定账号的指定服务 是否已被封禁,如果被封禁则抛出异常 `DisableServiceException`(支持传入多个业务标识)
StpUtil.getDisableTime(10001, "<业务标识>");   // 获取:指定账号的指定服务 剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
StpUtil.untieDisable(loginId, "<业务标识>");   // 解封:指定账号的指定服务(支持传入多个业务标识)
1
2
3
4
5

13、阶梯封禁 (version >= 1.31.0) ​

java
StpUtil.disableLevel(10001, "comment", 3, 10000);   // 分类阶梯封禁,参数:封禁账号、封禁服务、封禁级别、封禁时间 
StpUtil.disableLevel(10001, 3, 10000);   // 阶梯封禁(无业务标识,使用默认服务),参数:封禁账号、封禁级别、封禁时间
StpUtil.getDisableLevel(10001, "comment");   // 获取:指定账号的指定服务 封禁的级别 (如果此账号未被封禁则返回 -2)
StpUtil.getDisableLevel(10001);   // 获取:指定账号的封禁等级(无业务标识,未封禁返回 -2)
StpUtil.isDisableLevel(10001, "comment", 3);   // 判断:指定账号的指定服务 是否已被封禁到指定级别,返回 true 或 false
StpUtil.isDisableLevel(10001, 3);   // 判断:指定账号是否被封禁到指定级别(无业务标识)
StpUtil.checkDisableLevel(10001, "comment", 2);   // 校验:指定账号的指定服务 是否已被封禁到指定级别(例如 comment服务 已被3级封禁,这里校验是否达到2级),如果已达到此级别,则抛出异常 
StpUtil.checkDisableLevel(10001, 2);   // 校验:指定账号是否被封禁到指定级别(无业务标识)
1
2
3
4
5
6
7
8

14、身份切换 ​

java
StpUtil.switchTo(10044);   // 临时切换身份为指定账号id 
StpUtil.endSwitch();   // 结束临时切换身份
StpUtil.isSwitch();   // 当前是否正处于[身份临时切换]中 
StpUtil.switchTo(10044, () -> {});   // 在一个代码段里方法内,临时切换身份为指定账号id
1
2
3
4

15、二级认证 ​

java
StpUtil.openSafe(safeTime);   // 在当前会话 开启二级认证 
StpUtil.isSafe();   // 当前会话 是否处于二级认证时间内 
StpUtil.checkSafe();   // 检查当前会话是否已通过二级认证,如未通过则抛出异常 
StpUtil.getSafeTime();   // 获取当前会话的二级认证剩余有效时间 (单位: 秒, 返回-2代表尚未通过二级认证)
StpUtil.closeSafe();   // 在当前会话 结束二级认证
1
2
3
4
5

16、带有业务标识的二级认证 ​

java
StpUtil.openSafe("<业务标识>", safeTime);   // 在当前会话 指定业务标识开启二级认证 
StpUtil.isSafe("<业务标识>");   // 当前会话 指定业务标识是否处于二级认证时间内 
StpUtil.isSafe(tokenValue, "<业务标识>");   // 判断指定 token 的指定业务是否处于二级认证时间内
StpUtil.checkSafe("<业务标识>");   // 检查当前会话,指定业务标识是否已通过二级认证,如未通过则抛出异常 
StpUtil.getSafeTime("<业务标识>");   // 获取当前会话的指定业务标识二级认证剩余有效时间 (单位: 秒, 返回-2代表尚未通过二级认证)
StpUtil.closeSafe("<业务标识>");   // 在当前会话 结束指定业务标识二级认证
1
2
3
4
5
6








发现错误? 您可以在 Gitee 或 GitHub 或 AtomGit 帮助我们完善此页文档! 或 加入讨论群 交流反馈。

我们坚信,即使再复杂的技术,也可以用清晰、干练、易懂的文字描述出它的具体细节,如果你在阅读文档时有难以理解的章节,那一定是我们还没有优化好它, 请向我们 反馈 你的困惑之处,我们将持续优化文档。


鲁ICP备18046274号-5|公安备案鲁公网安备37011202002956号
目录

本页无章节

推荐关闭
Sa-Token 商业版:轻松搭建 SSO 单点登录、OAuth2.0 统一认证、API Key 认证。全源码交付、可二开。
加入 Sa-Token 框架交流群

离线版文档历史所有版本文档Demo 示例大全下载

如果 Sa-Token 帮助到了你,希望你可以向同事、朋友推荐了解本框架,这对我们非常重要,感谢支持!

加油,工程师!