gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:48:23 34 4
gpt4 key购买 nike

我有一个由 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() 从 token 中提取 Keycloak 领域角色,但该方法根本没有执行。我的意思是在从 Keycloak 成功验证并重定向到应用程序后, oidcUserService() 方法没有被执行。它似乎只在应用程序启动时执行,这很奇怪。

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

编辑

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

安全配置在 application.ymlSecurityConfig 类中

最佳答案

我找到了为什么 oidcUserService()身份验证后未调用方法。原因是 token 的类型,我愚蠢地从 Spring Security 文档中复制了代码,而没有注意该信息。

在文档中它是关于 OidcUserRequest而在我的例子中是 OAuth2UserRequest ,所以这是 OAUTH2 之间的冲突对比OIDC .将方法更改为:

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

}

解决了我的问题。我现在可以从访问 token 中获取 Keycloak 领域角色。

关于spring-boot - 身份验证后未执行 Spring Security oauth2Login OAuth2UserService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63834227/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com