身份验证后未执行Spring Security oauth2Login OAuth2UserService



我有一个由Key斗篷保护的Spring Boot Admin应用程序,我定义了一个具有领域角色ACTUATOR的用户。问题是,经过身份验证后,SpringSecurity无法访问领域角色。我可以看到授予的权限:Granted Authorities: ROLE_USER, SCOPE_actuator_access, SCOPE_profile'

在查看文档时,我发现了以下部分: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()从令牌中提取Keycapture领域角色,但该方法根本没有执行。我的意思是,在Keycloft成功验证并重定向到应用程序后,oidcUserService()方法不会执行。它似乎只在应用程序启动时执行,这很奇怪。

问题是,在这种情况下,我如何检索领域角色?

编辑

我在这里添加了一个示例项目:https://github.com/akuma8/sba-keycloak-spring-security

安全配置在application.ymlSecurityConfig类中

我发现了在身份验证后没有调用oidcUserService()方法的原因。原因是令牌的类型,我愚蠢地从Spring Security文档中复制了代码,而没有注意到这些信息。

在文档中,它是关于OidcUserRequest的,而在我的情况下,它是OAuth2UserRequest,所以这是OAUTH2OIDC之间的冲突。将方法更改为:

private OAuth2UserService<OAuth2UserRequest, OAuth2User> oauth2UserService() {
// code extracting authorities from JWT here
}

解决了我的问题。我现在可以从访问令牌中获得Keycloft领域的角色。

我不知道为什么没有调用这个oidcUserService。您可以使用JwtAuthenticationConverter,并将JWT映射到您需要的任何角色。

这有点棘手,所以这里有两个例子:

  • https://dev.to/toojannarong/spring-security-with-jwt-the-easiest-way-2i43(最新但有点过于宽泛,请查看"自定义声明"部分(
  • https://stackoverflow.com/a/58234971/1722236(已过时(

注意,我不知道在解析JWT签名之前是否应该自己检查,或者Spring OAuth是否会这样做。这值得检查。

最新更新