package cc.uncarbon.module.adminapi.util;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.fun.SaFunction;
import cn.dev33.satoken.listener.SaTokenEventCenter;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.session.TokenSign;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpLogic;
import java.util.List;
/**
* 后台管理专用 StpUtil
* 文档见 SA-Token -> 多账户认证:https://sa-token.cc/doc.html#/up/many-account
*
* @author Uncarbon
* @see cn.dev33.satoken.stp.StpUtil
*/
public final class AdminStpUtil {
private AdminStpUtil() {
}
/**
* 多账号体系下的类型标识
*/
public static final String TYPE = "AdminStpUtil";
/**
* 底层使用的 StpLogic 对象
*/
public static StpLogic stpLogic = new StpLogic(TYPE);
/**
* 获取当前 StpLogic 的账号类型
*
* @return /
*/
public static String getLoginType() {
return stpLogic.getLoginType();
}
/**
* 安全的重置 StpLogic 对象
*
*
1、更改此账户的 StpLogic 对象
*
2、put 到全局 StpLogic 集合中
*
3、发送日志
*
* @param newStpLogic /
*/
public static void setStpLogic(StpLogic newStpLogic) {
// 1、重置此账户的 StpLogic 对象
stpLogic = newStpLogic;
// 2、添加到全局 StpLogic 集合中
// 以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic
SaManager.putStpLogic(newStpLogic);
// 3、$$ 发布事件:更新了 stpLogic 对象
SaTokenEventCenter.doSetStpLogic(stpLogic);
}
/**
* 获取 StpLogic 对象
*
* @return /
*/
public static StpLogic getStpLogic() {
return stpLogic;
}
// ------------------- 获取 token 相关 -------------------
/**
* 返回 token 名称,此名称在以下地方体现:Cookie 保存 token 时的名称、提交 token 时参数的名称、存储 token 时的 key 前缀
*
* @return /
*/
public static String getTokenName() {
return stpLogic.getTokenName();
}
/**
* 在当前会话写入指定 token 值
*
* @param tokenValue token 值
*/
public static void setTokenValue(String tokenValue) {
stpLogic.setTokenValue(tokenValue);
}
/**
* 在当前会话写入指定 token 值
*
* @param tokenValue token 值
* @param cookieTimeout Cookie存活时间(秒)
*/
public static void setTokenValue(String tokenValue, int cookieTimeout) {
stpLogic.setTokenValue(tokenValue, cookieTimeout);
}
/**
* 在当前会话写入指定 token 值
*
* @param tokenValue token 值
* @param loginModel 登录参数
*/
public static void setTokenValue(String tokenValue, SaLoginModel loginModel) {
stpLogic.setTokenValue(tokenValue, loginModel);
}
/**
* 获取当前请求的 token 值
*
* @return 当前tokenValue
*/
public static String getTokenValue() {
return stpLogic.getTokenValue();
}
/**
* 获取当前请求的 token 值 (不裁剪前缀)
*
* @return /
*/
public static String getTokenValueNotCut() {
return stpLogic.getTokenValueNotCut();
}
/**
* 获取当前会话的 token 参数信息
*
* @return token 参数信息
*/
public static SaTokenInfo getTokenInfo() {
return stpLogic.getTokenInfo();
}
// ------------------- 登录相关操作 -------------------
// --- 登录
/**
* 会话登录
*
* @param id 账号id,建议的类型:(long | int | String)
*/
public static void login(Object id) {
stpLogic.login(id);
}
/**
* 会话登录,并指定登录设备类型
*
* @param id 账号id,建议的类型:(long | int | String)
* @param device 设备类型
*/
public static void login(Object id, String device) {
stpLogic.login(id, device);
}
/**
* 会话登录,并指定是否 [记住我]
*
* @param id 账号id,建议的类型:(long | int | String)
* @param isLastingCookie 是否为持久Cookie,值为 true 时记住我,值为 false 时关闭浏览器需要重新登录
*/
public static void login(Object id, boolean isLastingCookie) {
stpLogic.login(id, isLastingCookie);
}
/**
* 会话登录,并指定此次登录 token 的有效期, 单位:秒
*
* @param id 账号id,建议的类型:(long | int | String)
* @param timeout 此次登录 token 的有效期, 单位:秒
*/
public static void login(Object id, long timeout) {
stpLogic.login(id, timeout);
}
/**
* 会话登录,并指定所有登录参数 Model
*
* @param id 账号id,建议的类型:(long | int | String)
* @param loginModel 此次登录的参数Model
*/
public static void login(Object id, SaLoginModel loginModel) {
stpLogic.login(id, loginModel);
}
/**
* 创建指定账号 id 的登录会话数据
*
* @param id 账号id,建议的类型:(long | int | String)
* @return 返回会话令牌
*/
public static String createLoginSession(Object id) {
return stpLogic.createLoginSession(id);
}
/**
* 创建指定账号 id 的登录会话数据
*
* @param id 账号id,建议的类型:(long | int | String)
* @param loginModel 此次登录的参数Model
* @return 返回会话令牌
*/
public static String createLoginSession(Object id, SaLoginModel loginModel) {
return stpLogic.createLoginSession(id, loginModel);
}
// --- 注销
/**
* 在当前客户端会话注销
*/
public static void logout() {
stpLogic.logout();
}
/**
* 会话注销,根据账号id
*
* @param loginId 账号id
*/
public static void logout(Object loginId) {
stpLogic.logout(loginId);
}
/**
* 会话注销,根据账号id 和 设备类型
*
* @param loginId 账号id
* @param device 设备类型 (填 null 代表注销该账号的所有设备类型)
*/
public static void logout(Object loginId, String device) {
stpLogic.logout(loginId, device);
}
/**
* 会话注销,根据指定 Token
*
* @param tokenValue 指定 token
*/
public static void logoutByTokenValue(String tokenValue) {
stpLogic.logoutByTokenValue(tokenValue);
}
/**
* 踢人下线,根据账号id
*
当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5
* * @param loginId 账号id */ public static void kickout(Object loginId) { stpLogic.kickout(loginId); } /** * 踢人下线,根据账号id 和 设备类型 *当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5
* * @param loginId 账号id * @param device 设备类型 (填 null 代表踢出该账号的所有设备类型) */ public static void kickout(Object loginId, String device) { stpLogic.kickout(loginId, device); } /** * 踢人下线,根据指定 token *当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5
* * @param tokenValue 指定 token */ public static void kickoutByTokenValue(String tokenValue) { stpLogic.kickoutByTokenValue(tokenValue); } /** * 顶人下线,根据账号id 和 设备类型 *当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4
* * @param loginId 账号id * @param device 设备类型 (填 null 代表顶替该账号的所有设备类型) */ public static void replaced(Object loginId, String device) { stpLogic.replaced(loginId, device); } // 会话查询 /** * 判断当前会话是否已经登录 * * @return 已登录返回 true,未登录返回 false */ public static boolean isLogin() { return stpLogic.isLogin(); } /** * 判断指定账号是否已经登录 * * @return 已登录返回 true,未登录返回 false */ public static boolean isLogin(Object loginId) { return stpLogic.isLogin(loginId); } /** * 检验当前会话是否已经登录,如未登录,则抛出异常 */ public static void checkLogin() { stpLogic.checkLogin(); } /** * 获取当前会话账号id,如果未登录,则抛出异常 * * @return 账号id */ public static Object getLoginId() { return stpLogic.getLoginId(); } /** * 获取当前会话账号id, 如果未登录,则返回默认值 * * @param* 在配置为允许并发登录时,此方法只会返回队列的最后一个 token, * 如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId *
* * @param loginId 账号id * @return token值 */ public static String getTokenValueByLoginId(Object loginId) { return stpLogic.getTokenValueByLoginId(loginId); } /** * 获取指定账号 id 指定设备类型端的 token ** 在配置为允许并发登录时,此方法只会返回队列的最后一个 token, * 如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId *
* * @param loginId 账号id * @param device 设备类型,填 null 代表不限设备类型 * @return token值 */ public static String getTokenValueByLoginId(Object loginId, String device) { return stpLogic.getTokenValueByLoginId(loginId, device); } /** * 获取指定账号 id 的 token 集合 * * @param loginId 账号id * @return 此 loginId 的所有相关 token */ public static List此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id) * * @param loginId 指定账号id * @param time 封禁时间, 单位: 秒 (-1=永久封禁) */ public static void disable(Object loginId, long time) { stpLogic.disable(loginId, time); } /** * 判断:指定账号是否已被封禁 (true=已被封禁, false=未被封禁) * * @param loginId 账号id * @return / */ public static boolean isDisable(Object loginId) { return stpLogic.isDisable(loginId); } /** * 校验:指定账号是否已被封禁,如果被封禁则抛出异常 * * @param loginId 账号id */ public static void checkDisable(Object loginId) { stpLogic.checkDisable(loginId); } /** * 获取:指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) * * @param loginId 账号id * @return / */ public static long getDisableTime(Object loginId) { return stpLogic.getDisableTime(loginId); } /** * 解封:指定账号 * * @param loginId 账号id */ public static void untieDisable(Object loginId) { stpLogic.untieDisable(loginId); } // ------------------- 分类封禁 ------------------- /** * 封禁:指定账号的指定服务 *
此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id) * * @param loginId 指定账号id * @param service 指定服务 * @param time 封禁时间, 单位: 秒 (-1=永久封禁) */ public static void disable(Object loginId, String service, long time) { stpLogic.disable(loginId, service, time); } /** * 判断:指定账号的指定服务 是否已被封禁(true=已被封禁, false=未被封禁) * * @param loginId 账号id * @param service 指定服务 * @return / */ public static boolean isDisable(Object loginId, String service) { return stpLogic.isDisable(loginId, service); } /** * 校验:指定账号 指定服务 是否已被封禁,如果被封禁则抛出异常 * * @param loginId 账号id * @param services 指定服务,可以指定多个 */ public static void checkDisable(Object loginId, String... services) { stpLogic.checkDisable(loginId, services); } /** * 获取:指定账号 指定服务 剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) * * @param loginId 账号id * @param service 指定服务 * @return see note */ public static long getDisableTime(Object loginId, String service) { return stpLogic.getDisableTime(loginId, service); } /** * 解封:指定账号、指定服务 * * @param loginId 账号id * @param services 指定服务,可以指定多个 */ public static void untieDisable(Object loginId, String... services) { stpLogic.untieDisable(loginId, services); } // ------------------- 阶梯封禁 ------------------- /** * 封禁:指定账号,并指定封禁等级 * * @param loginId 指定账号id * @param level 指定封禁等级 * @param time 封禁时间, 单位: 秒 (-1=永久封禁) */ public static void disableLevel(Object loginId, int level, long time) { stpLogic.disableLevel(loginId, level, time); } /** * 封禁:指定账号的指定服务,并指定封禁等级 * * @param loginId 指定账号id * @param service 指定封禁服务 * @param level 指定封禁等级 * @param time 封禁时间, 单位: 秒 (-1=永久封禁) */ public static void disableLevel(Object loginId, String service, int level, long time) { stpLogic.disableLevel(loginId, service, level, time); } /** * 判断:指定账号是否已被封禁到指定等级 * * @param loginId 指定账号id * @param level 指定封禁等级 * @return / */ public static boolean isDisableLevel(Object loginId, int level) { return stpLogic.isDisableLevel(loginId, level); } /** * 判断:指定账号的指定服务,是否已被封禁到指定等级 * * @param loginId 指定账号id * @param service 指定封禁服务 * @param level 指定封禁等级 * @return / */ public static boolean isDisableLevel(Object loginId, String service, int level) { return stpLogic.isDisableLevel(loginId, service, level); } /** * 校验:指定账号是否已被封禁到指定等级(如果已经达到,则抛出异常) * * @param loginId 指定账号id * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常) */ public static void checkDisableLevel(Object loginId, int level) { stpLogic.checkDisableLevel(loginId, level); } /** * 校验:指定账号的指定服务,是否已被封禁到指定等级(如果已经达到,则抛出异常) * * @param loginId 指定账号id * @param service 指定封禁服务 * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常) */ public static void checkDisableLevel(Object loginId, String service, int level) { stpLogic.checkDisableLevel(loginId, service, level); } /** * 获取:指定账号被封禁的等级,如果未被封禁则返回-2 * * @param loginId 指定账号id * @return / */ public static int getDisableLevel(Object loginId) { return stpLogic.getDisableLevel(loginId); } /** * 获取:指定账号的 指定服务 被封禁的等级,如果未被封禁则返回-2 * * @param loginId 指定账号id * @param service 指定封禁服务 * @return / */ public static int getDisableLevel(Object loginId, String service) { return stpLogic.getDisableLevel(loginId, service); } // ------------------- 临时身份切换 ------------------- /** * 临时切换身份为指定账号id * * @param loginId 指定loginId */ public static void switchTo(Object loginId) { stpLogic.switchTo(loginId); } /** * 结束临时切换身份 */ public static void endSwitch() { stpLogic.endSwitch(); } /** * 判断当前请求是否正处于 [ 身份临时切换 ] 中 * * @return / */ public static boolean isSwitch() { return stpLogic.isSwitch(); } /** * 在一个 lambda 代码段里,临时切换身份为指定账号id,lambda 结束后自动恢复 * * @param loginId 指定账号id * @param function 要执行的方法 */ public static void switchTo(Object loginId, SaFunction function) { stpLogic.switchTo(loginId, function); } // ------------------- 二级认证 ------------------- /** * 在当前会话 开启二级认证 * * @param safeTime 维持时间 (单位: 秒) */ public static void openSafe(long safeTime) { stpLogic.openSafe(safeTime); } /** * 在当前会话 开启二级认证 * * @param service 业务标识 * @param safeTime 维持时间 (单位: 秒) */ public static void openSafe(String service, long safeTime) { stpLogic.openSafe(service, safeTime); } /** * 判断:当前会话是否处于二级认证时间内 * * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 */ public static boolean isSafe() { return stpLogic.isSafe(); } /** * 判断:当前会话 是否处于指定业务的二级认证时间内 * * @param service 业务标识 * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 */ public static boolean isSafe(String service) { return stpLogic.isSafe(service); } /** * 判断:指定 token 是否处于二级认证时间内 * * @param tokenValue Token 值 * @param service 业务标识 * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 */ public static boolean isSafe(String tokenValue, String service) { return stpLogic.isSafe(tokenValue, service); } /** * 校验:当前会话是否已通过二级认证,如未通过则抛出异常 */ public static void checkSafe() { stpLogic.checkSafe(); } /** * 校验:检查当前会话是否已通过指定业务的二级认证,如未通过则抛出异常 * * @param service 业务标识 */ public static void checkSafe(String service) { stpLogic.checkSafe(service); } /** * 获取:当前会话的二级认证剩余有效时间(单位: 秒, 返回-2代表尚未通过二级认证) * * @return 剩余有效时间 */ public static long getSafeTime() { return stpLogic.getSafeTime(); } /** * 获取:当前会话的二级认证剩余有效时间(单位: 秒, 返回-2代表尚未通过二级认证) * * @param service 业务标识 * @return 剩余有效时间 */ public static long getSafeTime(String service) { return stpLogic.getSafeTime(service); } /** * 在当前会话 结束二级认证 */ public static void closeSafe() { stpLogic.closeSafe(); } /** * 在当前会话 结束指定业务标识的二级认证 * * @param service 业务标识 */ public static void closeSafe(String service) { stpLogic.closeSafe(service); } }