jeecgboot 登录用户唯一实现方式

文章目录

功能需求:实现同一个账号只能登录一次,如果同一个账号在另一个地方登录,则把前面登录的用户顶掉
目前形式:现在项目一个用户可以同时登录多次,意思就是可以重复登录。

1:实现方法

  1. 实现逻辑:因为项目使用token来确认用户登录的权限,所以这里首先要确保同一个账号登录有一个唯一token。如果已经有一个用户登录,则会产生一个token,这里token会存储到redis,存储的key使用用户的唯一值或者能区分用户的方式,这里使用用户的id+前缀的形式作为key,这里就保证了,同一个账号登录,则token都会保存到redis。且都能通过这个唯一key拿到用户key。到这里就算完成了第一步,可以随时拿到token。下面就是验证环节,用户登录期间,就可以拿之前生成的token做验证,如果已经有人登录过,则拿这个用户唯一key,则能拿到值,如果能拿到值,那么我们就要把前面登录用户的token信息等都删掉。这个可以仿照退出登录书写。如果不能拿到值,则直接走正常的登录逻辑就好
  2. 检验登录用户唯一的token
//下面这两句放在这个方法里:userInfo()
redisUtil.set(CommonConstant.PREFIX_ONLY_USER_TOKEN + sysUser.getId(),token);
redisUtil.expire(CommonConstant.PREFIX_ONLY_USER_TOKEN + sysUser.getId(), JwtUtil.EXPIRE_TIME*2 / 1000);
  1. 登录唯一验证方法
 /**
     * 登录唯一验证
     * @param sysUser
     * @return
     */
    public Result<JSONObject> onlyUser(SysUser sysUser){
        Result<JSONObject> result = new Result<JSONObject>();
        //获取用户token
        String token = "";
        if(redisUtil.hasKey(CommonConstant.PREFIX_ONLY_USER_TOKEN + sysUser.getId())){
             token = redisUtil.get(CommonConstant.PREFIX_ONLY_USER_TOKEN + sysUser.getId()).toString();
            //校验Token有效性
            //用户退出逻辑
            if (oConvertUtils.isEmpty(token)) {
                return result.error500("退出登录失败!");
            }
            String username = JwtUtil.getUsername(token);
            if (sysUser != null) {
                sysBaseAPI.addLog(username + " 退出成功!", CommonConstant.LOG_TYPE_1, null, username);
                log.info(" 用户名:  " + sysUser.getRealname() + ",退出成功! ");
                //清空用户登录Token缓存
                redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token);
                //清空用户登录Shiro权限缓存
                redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());
                //清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>
                redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));
                //LL:清空登录用户唯一缓存
                redisUtil.del(CommonConstant.PREFIX_ONLY_USER_TOKEN + sysUser.getId());
                //调用shiro的logout
                SecurityUtils.getSubject().logout();
                result.success("退出登录成功!");
            } else {
                return result.error500("Token无效!");
            }
        }
        return result;
    }
  1. 登录方法调用onlyUser()方法
onlyUser(sysUser);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值