shiro 的自定义 realm 中使用 mapper 的一个很奇怪的 BUG
資深大佬 : ShutTheFu2kUP 20
简单描述一下: 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 感到很疑惑,希望有大佬能够解答。
大佬有話說 (1)