shiro 的自定义 realm 中使用 mapper 的一个很奇怪的 BUG

2020-08-17 16:32:35 +08:00
 ShutTheFu2kUP

简单描述一下: service 中将新用户的数据插入 user 表,然后把 userId 丢给 shiro 进行登录,大部分用户都没问题,但是偶尔会出现有的用户在 realm 中通过 userId 去数据库查询出结果为 null 的情况,影响了后续逻辑。

// 这个是 service 中登录的方法
public void login(String userName, String password) {
    // 新增用户
    User user = new User();
    user.setUserName(userName);
    user.setPassword(password);
    
    Integer userId = userMapper.insert(user);

    // shiro 登录(使用自定义 token)
    UserToken userToken = userToken(userId);
    
    SecurityUtil.getSubject.login(userToken);
    
    // 继续以下逻辑...
}
// 这个是自定义 realm 中进行登录的方法,上面 SecurityUtil.getSubject.login(userToken)之后就是跑到这里面来
public class AuthRealm extends AuthorizingRealm {
    
    private AuthenticationInfo getUserAuthInfo(UserToken token) throws AuthenticationException{
        Integer userId = token.getUserId();
        User user = userMapper.selectById(userId);
        
        if(user == null) {
            // 此处就是 BUG 点,大部分用户正常,偶尔出现一个用户查询出来的 user 为 null,且打印日志传进来 token 中的 userId 有值,查数据库也有对应数据
            LOGGER.error("找不到用户账号:{}", token.getUserId());
            throw new UnknownAccountException();//没找到帐号
        } else {
            AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(userId.toString(), userId.toString(), this.getName());
            return authcInfo;
        }
    }
    
}

不要问我为什么还要在 realm 里面查一遍,这段代码不是我写的,但是就是对这个 BUG 感到很疑惑,希望有大佬能够解答。

1098 次点击
所在节点    Java
1 条回复
ShutTheFu2kUP
2020-08-17 16:39:14 +08:00
好吧,没问题了,只是主从库导致的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/699013

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX