用于灵活控制单个账号多设备登录的情况
#token配置
token: # 这个是若依框架本身存在的配置
# 是否允许并多设备登录 true:允许 false:不允许 这个是新增的配置
singleLogin: false
位置:
ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java
/**
* 登录用户id redis key 用于实现灵活控制多设备登录
*/
public static final String LOGIN_USER_ID_KEY = "login_user_ids:";
位置:
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
// 是否允许多设备登录
@Value("${token.singleLogin}")
private boolean singleLogin;
/**
* 获取用户Key
*
* @param userId 当前登录用户的主键id
* @return
*/
private String getUserKey(Long userId) {
return CacheConstants.LOGIN_USER_ID_KEY + userId;
}
主要原因:在这里做主要是保证后续如果由多种登录方式 手机验证码等 可以兼容(只要都调用了
createToken
方法去创建token
令牌)
/**
* 刷新令牌有效期
*
* @param loginUser 登录信息
*/
public void refreshToken(LoginUser loginUser) {
// 判断是否允许多端登录, 如果不允许则删除
if (!singleLogin) {
String userIdKey = getUserKey(loginUser.getUserId());
String userKey = redisCache.getCacheObject(userIdKey);
if (StringUtils.isNotEmpty(userKey)) {
redisCache.deleteObject(userIdKey);
redisCache.deleteObject(userKey);
}
}
loginUser.setLoginTime(System.currentTimeMillis());
loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
// 根据uuid将loginUser缓存
String userKey = getTokenKey(loginUser.getToken());
redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
// 判断是否允许多端登录, 如果不允许, 则记录用户IdKey对应的用户信息Key
if (!singleLogin) {
String userIdKey = getUserKey(loginUser.getUserId());
redisCache.setCacheObject(userIdKey, userKey, expireTime, TimeUnit.MINUTES);
}
}
这个方法用于手动退出时 删除对应的token
以及本次维护的redis key
,也就是后续对LogoutSuccessHandlerImpl
类做调整的一部分。
/**
* 删除用户身份信息
*/
public void delLoginUser(String token, Long userId) {
if (StringUtils.isNotEmpty(token)) {
String userKey = getTokenKey(token);
redisCache.deleteObject(userKey);
}
if (StringUtils.isNotEmpty(userId)) {
String userIdKey = getUserKey(userId);
redisCache.deleteObject(userIdKey);
}
}
用于后续SysUserOnlineController
类强制退出接口代码做相关调整,在前端的监控-在线用户界面做强退操作
/**
* 强制退出
*
* @param tokenId token(uuid)
*/
public void forceLogout(String tokenId){
String userKey = getTokenKey(tokenId);
if(!singleLogin){//多设备登录相关控制代码
LoginUser loginUser = redisCache.getCacheObject(userKey);
String userId = loginUser.getUserId();
String userIdKey = getUserKey(userId);
redisCache.deleteObject(userIdKey);
}
redisCache.deleteObject(userKey);
}
tokenService.delLoginUser(loginUser.getToken(), loginUser.getUserId());
位置:
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
注意引包时,引入项目的,而不是
Security
包的
import com.ruoyi.framework.web.service.TokenService;
@Autowired
private TokenService tokenService;
/**
* 强退用户
*/
public AjaxResult forceLogout(@PathVariable String tokenId) {
tokenService.forceLogout(tokenId);
return AjaxResult.success();
}
powered by kaifamiao