zlt2000 / microservices-platform

基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务多租户系统架构。并引入组件化的**实现高内聚低耦合,项目代码简洁注释丰富上手容易,适合学习和企业中使用。真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案,面向互联网设计同时适合B端和C端用户,支持CI/CD多环境部署,并提供应用管理方便第三方系统接入;同时还集合各种微服务治理功能和监控功能。模块包括:企业级的认证系统、开发平台、应用监控、慢sql监控、统一日志、单点登录、Redis分布式高速缓存、配置中心、分布式任务调度、接口文档、代码生成等等。

Home Page:http://zlt2000.cn

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

3.6 3.6.1 3.7版本(3.5以上的)token删除失败

hsgmj opened this issue · comments

commented

问题描述:应用里面有 “app" pc,然后在token列表选择app, 选择对应的token 点击删除 页面列表会少一条数据 同时提示成功。

但是 重新刷新则 会发现数据实际没有删除成功。查看redis里面
client_id_to_access:* 查出来对应的list里面对应token没有删除。

跟踪代码 发现 CustomRedisTokenStore对应的removeAccessToken里面

conn.get(accessKey);
conn.get(authKey);
List results = conn.closePipeline();
byte[] access = (byte[]) results.get(0);
byte[] auth = (byte[]) results.get(1);

实际上redis里面accessKey authKey都是可以查得到,但results.get(0) 基本上都是返回的空( 偶尔才返回)。

如果返回空
则:
conn.lRem(unameKey, 1, access);
conn.lRem(clientId, 1, access);
conn.del(serialize(ACCESS + key)); 这几行不会执行 导致lrem里面的list数据没有移除掉。

image

再次刷新 会发现如上图所示。有重复的也有用户名等信息不存在的现象 根本原因就是results.get(0) 和results.get(1)没有值导致 lRem没有执行。

证据:

  1. 下载github的3.7 3.6 3.6.1 3.5 在本地跑(相同的redis 5.0.3)
    3.5没问题 每次都成功
    3.5以上90%以上 概率会 byte[] access = (byte[]) results.get(0);返回的是空, byte[] auth = (byte[]) results.get(1);也80%概率是空。

2.当将openPipeline closePipeline等注释掉,然后用同步方式 如下:
byte[] access = conn.get(accessKey);
byte[] auth = conn.get(authKey);

则 不管是3.5 3.6 3.7都无问题

3.redis集群我们试过 4.0.11 和5.0.3 都一样 跟版本的关联性应该可以排除

如上测试也许不全面 但是希望有朋友能够帮忙看看解惑

commented

参考commit:782b5e075bd34bcdc8b10e9a318df6e5fae87f53