如何解决身份验证后未执行Spring Security oauth2Login OAuth2UserService
我有一个由Keycloak保护的Spring Boot Admin应用程序,我定义了一个具有领域角色ACTUATOR
的用户。
问题在于,在身份验证之后,Spring Security无法访问领域角色。我可以看到授予的权限:Granted Authorities: ROLE_USER,SCOPE_actuator_access,SCOPE_profile'
查看文档,我发现以下部分:Delegation-based strategy with OAuth2UserService,这是我的配置:
这是我的配置:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure( HttpSecurity http ) throws Exception {
http.csrf().disable().cors().disable();
http.authorizeRequests()
.antMatchers( "/error","/instances","/**/*.css","/**/img/**","/**/third-party/**","/*.js" )
.permitAll()
.anyRequest().hasRole( "ACTUATOR" )
.and()
.oauth2Login( oauth2 -> oauth2.userInfoEndpoint(
userInfo -> userInfo.oidcUserService( this.oidcUserService() ) ) );
}
// I just copy-paste the doc's code to play with it...
private OAuth2UserService<OidcUserRequest,OidcUser> oidcUserService() {
final OidcUserService delegate = new OidcUserService();
return ( userRequest ) -> {
OidcUser oidcUser = delegate.loadUser( userRequest );
//TODO find a way to extract realm roles
OAuth2AccessToken accessToken = userRequest.getAccessToken();
Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
oidcUser = new DefaultOidcUser( mappedAuthorities,oidcUser.getIdToken(),oidcUser.getUserInfo() );
return oidcUser;
};
}
我希望使用方法oidcUserService()
从令牌中提取Keycloak领域角色,但是该方法根本不执行。我的意思是,从Keycloak进行成功身份验证并重定向到应用程序后,oidcUserService()
方法不会执行。似乎只在应用程序启动时执行,这很奇怪。
问题是在这种情况下如何检索领域角色?
编辑
我在这里添加了一个示例项目:https://github.com/akuma8/sba-keycloak-spring-security
安全配置在application.yml
和SecurityConfig
类中
解决方法
我发现了为什么认证后没有调用oidcUserService()
方法。原因是令牌的类型,我从Spring Security文档中愚蠢地复制了代码,而没有注意这些信息。
在文档中大约是OidcUserRequest
,而在我的情况下是OAuth2UserRequest
,因此OAUTH2
与OIDC
之间存在冲突。将方法更改为:
private OAuth2UserService<OAuth2UserRequest,OAuth2User> oauth2UserService() {
// code extracting authorities from JWT here
}
解决了我的问题。现在,我可以从访问令牌中获取Keycloak领域角色。
,我不知道为什么没有调用此oidcUserService。您可以改用JwtAuthenticationConverter并将JWT映射到所需的任何角色。
这有点棘手,所以这里有两个例子:
- https://dev.to/toojannarong/spring-security-with-jwt-the-easiest-way-2i43(最新但有点过头,请查看“自定义声明”部分)
- https://stackoverflow.com/a/58234971/1722236(已过时)
请注意,我不知道您是应该在解析JWT签名之前亲自检查它还是应该由Spring OAuth进行签名。值得检查。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。