简单描述一下: 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
ShutTheFu2kUP OP 好吧,没问题了,只是主从库导致的。
|