一、该问题的重现步骤是什么?
单点登录,是不是统一鉴权,各业务系统都必须要连到同一个redis?我看这里缓存了code
在统一授权时确认时,会写入到redis:
private void saveCode(String code, OAuth2User user) {
// 保存code信息到redis,30分钟过期
bladeRedis.setEx(OAuth2CodeUtil.codeKey(code), user, Duration.ofMinutes(30));
}
AuthorizationCodeGranter类在收到前端传过来的code时会从redis里找,没有找到会报错。是不是就意味着所有系统+统一授权要共用redis?
@Override
public OAuth2User user(OAuth2Request request) {
// 获取客户端信息并校验
OAuth2Client client = client(request);
if (!StringUtil.equals(client.getWebServerRedirectUri(), request.getRedirectUri())) {
OAuth2ExceptionUtil.throwFromCode(OAuth2ErrorCode.INVALID_CLIENT_REDIRECT_URI);
}
// 根据code获取用户信息
String code = request.getCode();
OAuth2User user = bladeRedis.get(OAuth2CodeUtil.codeKey(code));
// 判断用户是否存在
if (ObjectUtil.isNotEmpty(user)) {
// 校验用户信息
if (!userService.validateUser(user)) {
OAuth2ExceptionUtil.throwFromCode(OAuth2ErrorCode.INVALID_USER);
}
// 校验用户密码
if ((request.isCaptchaCode() || request.isPassword()) && !passwordHandler.matches(request.getPassword(), user.getPassword())) {
OAuth2ExceptionUtil.throwFromCode(OAuth2ErrorCode.INVALID_USER);
}
// 设置客户端信息
user.setClient(client);
// 删除缓存的code信息防止二次认证
bladeRedis.del(OAuth2CodeUtil.codeKey(code));
// 返回user
return Optional.ofNullable(this.enhancer)
.map(enhancer -> enhancer.enhance(user, request))
.orElse(user);
}
throw new UserInvalidException(ExceptionCode.INVALID_USER.getMessage());
}
}
3.
二、你期待的结果是什么?实际看到的又是什么?
所有 系统+统一授权,必须共用同一个redis?
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
bladex 4.4
四、请提供详细的错误堆栈信息,这很重要。
五、若有更多详细信息,请在下面提供。
扫一扫访问 Blade技术社区 移动端