package com.pj.current.satoken; import java.util.List; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.pj.project4sp.admin.SpAdmin; import com.pj.utils.cache.RedisUtil; import org.springframework.stereotype.Component; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.fun.SaFunction; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpUtil; /** * Sa-Token 权限认证工具类 (User版本) * * @author kong */ @Component public class StpUserUtil { /** * 账号类型标识 */ public static final String TYPE = "user"; /** * 底层的 StpLogic 对象 */ public static StpLogic stpLogic = new StpLogic(TYPE); /** * 获取当前 StpLogic 的账号类型 * * @return See Note */ public static String getLoginType() { return stpLogic.getLoginType(); } public static void saveAdmin(Long loginId, SpAdmin spAdmin) { String key = "admin:" + loginId; RedisUtil.set(key, JSONUtil.toJsonStr(spAdmin)); } public static SpAdmin getAdmin() { String key = "admin:" + StpUtil.getLoginIdAsLong(); String adminJson = RedisUtil.get(key); return JSONUtil.toBean(adminJson, SpAdmin.class); } public static void setLoginName(String name, String phone) { String key = "login_user:" + StpUtil.getLoginIdAsString(); JSONObject jsonObject = new JSONObject(); jsonObject.set("name", name).set("phone", phone); RedisUtil.set(key, JSONUtil.toJsonStr(jsonObject)); } public static String getLoginName() { try { String key = "login_user:" + StpUtil.getLoginIdAsString(); String cacheObJ = RedisUtil.get(key); return JSONUtil.parseObj(cacheObJ).getStr("name"); } catch (Exception e) { return ""; } } public static String getCustomerId() { SpAdmin admin = getAdmin(); return getAdmin().getCustomerId(); } /** * 重置 StpLogic 对象 * * @param stpLogic / */ public static void setStpLogic(StpLogic stpLogic) { StpUtil.stpLogic = stpLogic; // 防止自定义 stpLogic 被覆盖 SaManager.putStpLogic(stpLogic); } // =================== 获取token 相关 =================== /** * 返回token名称 * * @return 此StpLogic的token名称 */ public static String getTokenName() { return stpLogic.getTokenName(); } /** * 在当前会话写入当前TokenValue * * @param tokenValue token值 * @param cookieTimeout Cookie存活时间(秒) */ public static void setTokenValue(String tokenValue, int cookieTimeout) { stpLogic.setTokenValue(tokenValue, cookieTimeout); } /** * 获取当前TokenValue * * @return 当前tokenValue */ public static String getTokenValue() { return stpLogic.getTokenValue(); } /** * 获取当前会话的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 */ public static void login(Object id, boolean isLastingCookie) { stpLogic.login(id, isLastingCookie); } /** * 会话登录,并指定所有登录参数Model * * @param id 登录id,建议的类型:(long | int | String) * @param loginModel 此次登录的参数Model */ public static void login(Object id, SaLoginModel loginModel) { stpLogic.login(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 是否已登录 */ public static boolean isLogin() { return stpLogic.isLogin(); } /** * 检验当前会话是否已经登录,如未登录,则抛出异常 */ 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指定设备端的tokenValue *
在配置为允许并发登录时,此方法只会返回队列的最后一个token,
* 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId
*
* @param loginId 账号id
* @param device 设备标识
* @return token值
*/
public static String getTokenValueByLoginId(Object loginId, String device) {
return stpLogic.getTokenValueByLoginId(loginId, device);
}
/**
* 获取指定账号id的tokenValue集合
*
* @param loginId 账号id
* @return 此loginId的所有相关token
*/
public static List 此方法不会直接将此账号id踢下线,而是在对方再次登录时抛出`DisableLoginException`异常
*
* @param loginId 指定账号id
* @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁)
*/
public static void disable(Object loginId, long disableTime) {
stpLogic.disable(loginId, disableTime);
}
/**
* 指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
*
* @param loginId 账号id
* @return see note
*/
public static boolean isDisable(Object loginId) {
return stpLogic.isDisable(loginId);
}
/**
* 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
*
* @param loginId 账号id
* @return see note
*/
public static long getDisableTime(Object loginId) {
return stpLogic.getDisableTime(loginId);
}
/**
* 解封指定账号
*
* @param loginId 账号id
*/
public static void untieDisable(Object loginId) {
stpLogic.untieDisable(loginId);
}
// =================== 身份切换 ===================
/**
* 临时切换身份为指定账号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();
}
/**
* 在一个代码段里方法内,临时切换身份为指定账号id
*
* @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);
}
/**
* 当前会话 是否处于二级认证时间内
*
* @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
*/
public static boolean isSafe() {
return stpLogic.isSafe();
}
/**
* 检查当前会话是否已通过二级认证,如未通过则抛出异常
*/
public static void checkSafe() {
stpLogic.checkSafe();
}
/**
* 获取当前会话的二级认证剩余有效时间 (单位: 秒, 返回-2代表尚未通过二级认证)
*
* @return 剩余有效时间
*/
public static long getSafeTime() {
return stpLogic.getSafeTime();
}
/**
* 在当前会话 结束二级认证
*/
public static void closeSafe() {
stpLogic.closeSafe();
}
// =================== 历史API,兼容旧版本 ===================
/**
*
* 获取当前StpLogin的loginKey
*
* @return 当前StpLogin的loginKey
*/
@Deprecated
public static String getLoginKey() {
return stpLogic.getLoginType();
}
/**
*
* 在当前会话上登录id
*
* @param loginId 登录id,建议的类型:(long | int | String)
*/
@Deprecated
public static void setLoginId(Object loginId) {
stpLogic.login(loginId);
}
/**
*
* 在当前会话上登录id, 并指定登录设备
*
* @param loginId 登录id,建议的类型:(long | int | String)
* @param device 设备标识
*/
@Deprecated
public static void setLoginId(Object loginId, String device) {
stpLogic.login(loginId, device);
}
/**
*
* 在当前会话上登录id, 并指定登录设备
*
* @param loginId 登录id,建议的类型:(long | int | String)
* @param isLastingCookie 是否为持久Cookie
*/
@Deprecated
public static void setLoginId(Object loginId, boolean isLastingCookie) {
stpLogic.login(loginId, isLastingCookie);
}
/**
*
* 在当前会话上登录id, 并指定所有登录参数Model
*
* @param loginId 登录id,建议的类型:(long | int | String)
* @param loginModel 此次登录的参数Model
*/
@Deprecated
public static void setLoginId(Object loginId, SaLoginModel loginModel) {
stpLogic.login(loginId, loginModel);
}
/**
*
* 会话注销,根据账号id (踢人下线)
* 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2
*
* @param loginId 账号id
*/
@Deprecated
public static void logoutByLoginId(Object loginId) {
stpLogic.kickout(loginId);
}
/**
*
* 会话注销,根据账号id and 设备标识 (踢人下线)
* 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.getLoginType() ,使用方式保持不变
* 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变
* 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变
* 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变
* 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变
* 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变
* 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变
*