开发喵星球

若依前后端分离版本限制用户不允许多终端登录(七十一)

一、application.yml新增一个配置soloLogin用于限制多终端同时登录

# token配置
token:
    # 是否允许账户多终端同时登录(true允许 false不允许)
    soloLogin: false

二、Constants.java新增一个常量LOGIN_USERID_KEY公用

/**
 * 登录用户编号 redis key
 */
public static final String LOGIN_USERID_KEY = "login_userid:";

三、调整TokenService.java,存储&刷新缓存用户编号信息

// 是否允许账户多终端同时登录(true允许 false不允许)
@Value("${token.soloLogin}")
private boolean soloLogin;

/**
 * 删除用户身份信息
 */
public void delLoginUser(String token, Long userId)
{
    if (StringUtils.isNotEmpty(token))
    {
        String userKey = getTokenKey(token);
        redisCache.deleteObject(userKey);
    }
    if (!soloLogin && StringUtils.isNotNull(userId))
    {
        String userIdKey = getUserIdKey(userId);
        redisCache.deleteObject(userIdKey);
    }
}

/**
 * 刷新令牌有效期
 * 
 * @param loginUser 登录信息
 */
public void refreshToken(LoginUser loginUser)
{
    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);
    if (!soloLogin)
    {
        // 缓存用户唯一标识,防止同一帐号,同时登录
        String userIdKey = getUserIdKey(loginUser.getUser().getUserId());
        redisCache.setCacheObject(userIdKey, userKey, expireTime, TimeUnit.MINUTES);
    }
}

private String getUserIdKey(Long userId)
{
    return Constants.LOGIN_USERID_KEY + userId;
}

四、自定义退出处理类LogoutSuccessHandlerImpl.java清除缓存方法添加用户编号

// 删除用户缓存记录
tokenService.delLoginUser(loginUser.getToken(), loginUser.getUser().getUserId());

五、登录方法SysLoginService.java,验证如果用户不允许多终端同时登录,清除缓存信息

// 是否允许账户多终端同时登录(true允许 false不允许)
@Value("${token.soloLogin}")
private boolean soloLogin;

if (!soloLogin)
{
    // 如果用户不允许多终端同时登录,清除缓存信息
    String userIdKey = Constants.LOGIN_USERID_KEY + loginUser.getUser().getUserId();
    String userKey = redisCache.getCacheObject(userIdKey);
    if (StringUtils.isNotEmpty(userKey))
    {
        redisCache.deleteObject(userIdKey);
        redisCache.deleteObject(userKey);
    }
}
   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2023-12-12 11:51:03 阅读量:112
<<   >>


powered by kaifamiao