某个租户删除用户后将该用户踢下线

Blade 已结 2 393
shangmanet
shangmanet 剑圣 2023-11-14 09:53

一、该问题的重现步骤是什么?


1. 比如租户 556677 管理员将该租户下的用户 test 账号删除,test 账号在刷新页面或做某个操作的时候自动跳转到登录页面


2. 通过修改 application.yml 文件,将blade.token.state 和blade.token.single 同时设置为 true后添加代码JwtUtil.removeAccessToken(AuthUtil.getTenantId(), String.valueOf(userId));

确实能满足,但是业务上又需要满足同一个账号能支持多个浏览器同时登录和操作一些功能。


二、你期待的结果是什么?实际看到的又是什么?

=》期待的结果是不需要设置blade.token.single但是能满足去掉指定用户token


三、你正在使用的是什么产品,什么版本?在什么操作系统上?

2.5.1 springboot 版本


四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

2条回答
  •  admin
    admin (最佳回答者)
    2023-11-15 22:38

    理论上配置了blade.token.state ,系统就会把token缓存到redis,此时你再通过 JwtUtil.removeAccessToken ,那么下次这个token再去redis取的时候会取不到,调用就会跳转到登录界面了。


    你现在是按照上述操作无法实现功能么?

    0 讨论(2)
  • 2023-11-25 14:28

    通过在 yml 里面设置 state 确实能删除 redis 里面的 token,但是又要支持用户在多个浏览器登录,看了下 blade-tool 里面的代码,于是新增了一个方法通过 userId 模糊搜索 redis key,然后删除这些 keys 来达到所有浏览器踢人的结果(同时也能满足其他用户也支持多个浏览器登录)。


    下面附上代码给有类似业务的用户

    public static void removeAccessTokenByUserId(String tenantId, String userId) {
       // 获取所有该用户下的 redis-key
       Set<String> keys = getRedisTemplate().keys("*" + userId + "*");
       if (!CollectionUtils.isEmpty(keys)) {
          getRedisTemplate().delete(keys);
       }
    }

    上面代码其实没用到 tenantId,也懒得去掉了。


    然后业务代码里面调用JwtUtil.removeAccessTokenByUserId即可。


    其实这里也会存在一个业务问题,这样会清理掉包含了 userId 的所有 redis 值,这个看业务情况了。

    0 讨论(0)
提交回复