OidcUserService.setAccessibleScopes已弃用,如何改用setRetrieveUserInfo?
解决OidcUserService.setAccessibleScopes弃用后的替代方案
原来的setAccessibleScopes方法用于指定当请求包含哪些scopes时,OidcUserService会去获取UserInfo。现在该方法被弃用,替代方案是使用setRetrieveUserInfo,但核心逻辑不是修改请求的scopes(因为ClientRegistration的scopes是不可修改的配置项),而是通过该方法控制是否触发UserInfo的获取,并确保客户端注册时已配置好所需的scopes。
正确实现步骤:
在ClientRegistration中配置所需scopes
首先确保在构建ClientRegistration时已经添加了需要的scopes,而不是在OidcUserService中修改:ClientRegistration clientRegistration = ClientRegistration.withRegistrationId("your-reg-id") // 其他配置(如clientId、clientSecret、authorizationUri等) .scope(OidcScopes.OPENID, OidcScopes.PROFILE, OidcScopes.EMAIL, OidcScopes.ADDRESS, OidcScopes.PHONE) .build();使用setRetrieveUserInfo控制UserInfo获取
通过setRetrieveUserInfo传入判断逻辑,当请求包含所需scopes时返回true,触发UserInfo的获取:final OidcUserService oidcUserService = new OidcUserService(); oidcUserService.setOauth2UserService(userService); // 配置获取UserInfo的条件:当客户端注册的scopes包含所有所需范围时返回true oidcUserService.setRetrieveUserInfo(oidcUserRequest -> { Set<String> requiredScopes = Set.of( OidcScopes.PROFILE, OidcScopes.EMAIL, OidcScopes.ADDRESS, OidcScopes.PHONE, OidcScopes.OPENID); return oidcUserRequest.getClientRegistration().getScopes().containsAll(requiredScopes); // 若只需包含任意一个所需scope就触发获取,可替换为: // return requiredScopes.stream().anyMatch(oidcUserRequest.getClientRegistration().getScopes()::contains); }); return oidcUserService;
关键说明:
ClientRegistration的scopes是初始化时确定的不可修改集合,无法在OidcUserService中动态修改,必须在客户端注册阶段配置完整。setRetrieveUserInfo的核心作用是决定是否发起UserInfo请求,而OidcUserService会自动根据请求的scopes提取对应字段(比如包含EMAILscope时自动提取邮箱信息),无需额外指定字段范围。
内容的提问来源于stack exchange,提问作者Vladimir
相关产品推荐
相关产品推荐

