420 Star 1.8K Fork 830

li.shengzhao / spring-oauth-server

 / 详情

oauth_access_token表出现一个UserName有多条数据 抛出incorrect result size:expected 1,actual 2

Done
Opened this issue  
2016-09-06 11:50

同一时间创建了2个token

这样就再登陆就会抛出:incorrect result size:expected 1,actual 2。
当时的环境只有一个APP USER在连接。是内部测试。

这个BUG很严重。

version:0.4-beta

Comments (17)

能提供具体的重显步骤吗?还有试试0.5版本呢

步骤一 使用 password 类型登录
步骤二 刷新 refresh_token token ;
步骤三 再次使用步骤一登录; 此时数据库产生两条记录,此步骤可以重复

嗯, 尽快检查修复

@kleen 按照你提供的步骤, 我在本地无法重现你出现的问题, 你能再想想有什么原因

@monkeyk7 最近我这边也出现了这个问题,从日志中看到,同一时刻有两个相同的登陆请求,导致的生成两条token记录。我本地也验证了一下:
1、登陆代码中打断点阻塞一下请求
2、发送一条登陆请求
3、再重复发送一条登陆请求
4、断点去除全部放行
token记录中确实会出现两条authentication_id一样的记录

@yhaili 打断点去测试真没办法解决.需要正常的执行流程.
不过这问题值得沉思下.同一时刻同一用户多次登录不太常见

@monkeyk7 断点测试只是为了重现同一时刻两次登陆请求的情况,是为了验证是这个问题造成的多条token数据。现在我们生产环境中确实出现了同一时候2条登陆请求的情况,具体为什么会发出两条登陆请求,目前还在调查中

@yhaili 我能想到的在高并发情况下有可能会出现,但只是猜想, 一直未找到必然重现此问题的步骤; 也有可能是事务引起, 但数据库事务默认是 读已提交; 事务可能是一个原因;
我会继续跟踪,排查, 最终解决

我看了下创建token的源码,这里在并发的情况下本身就有问题
输入图片说明
输入图片说明

看代码很容易看懂, 但问题时如何复现, 高并发时,就有一个账号同时操作./这也不一定

这类问题在于 用同一个 client 同时去请求多次 access_token ; 第一个请求还没处理完,第二个相同请求已经到达 服务器,去查询 第一个请求的 AccessToken没查找 到就会出现这类情况;

这 在实际 使用中不适合,一个 client的同一用户 同时只能去请求一次即解决问题(不能一client并发去请求access_token);并且对获取 的 access_token 进行缓存(当要当期前再去请求新 access_token 或 调用 refresh token API)

monkeyk7 changed issue state from 待办的 to 进行中

@yhaili @monkeyk7 我们现在也遇到了这种多token问题。 我有个思路,不知道行不行。重写生成token的代码,内容不变的情况下,使用synchronized 做同步处理。这样行不行?

@feng_codes sync 肯定 是不推荐的;只需要一个client的用户不并发请求就没这问题。

我会去检查 下新版本中修复这问题没。如果解决了会升级下版本。

monkeyk7 set assignee to monkeyk7

在数据库中通过增加SQL字段 的唯一性来解决高并发下问题,SQL
ALTER TABLE oauth_access_token ADD UNIQUE INDEX authentication_id_unique_index(authentication_id);

另外在高并发场景下,推荐将 access_token 存入redis, 可参考文章:
http://andaily.com/blog/?p=19776

monkeyk7 changed issue state from 进行中 to 已完成

Sign in to comment

Status
Assignees
Milestones
Pull Requests
Successfully merging a pull request will close this issue.
Branches
Planed to start   -   Planed to end
-
Top level
Priority
参与者(5)
7238 mkk 1578914473
Java
1
https://gitee.com/shengzhao/spring-oauth-server.git
git@gitee.com:shengzhao/spring-oauth-server.git
shengzhao
spring-oauth-server
spring-oauth-server

Search