Spring Security OAuth2集成Keycloak后无法获取OidcUser用户信息如何解决
根因
你在安全配置类中显式禁用了oauth2Login能力,仅保留的oauth2Client组件只负责处理OAuth2授权、令牌获取逻辑,不会自动完成OIDC用户身份解析、构造OidcUser实例并写入安全上下文的流程,因此@AuthenticationPrincipal无法注入对应值。
你之前访问/helloworld接口能正常跳转登录拿令牌,是因为@RegisteredOAuth2AuthorizedClient注解本身可以触发授权码流程获取令牌,和oauth2Login无关,自然也不会生成用户身份信息存入上下文。
修复方案
1. 修改安全配置,启用oauth2Login
调整SecurityConfig.java中的配置,移除oauth2Login().disable(),同时调整权限规则,保证需要获取用户信息的接口需要登录后才能访问:
@EnableWebSecurity public class SecurityConfig { @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeRequests() // 可在此处配置无需登录即可访问的公开路径 // .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() // 启用oauth2Login,自动完成OIDC用户身份解析 .oauth2Login() .and() .oauth2Client(); return http.build(); } }
2. 可选:配置用户名属性(推荐)
解开application.yml中Keycloak provider配置的user-name-attribute注释,保证用户名可以正确映射:
spring: security: oauth2: client: provider: keycloak: issuer-uri: http://localhost:8180/auth/realms/myrealm user-name-attribute: preferred_username
修改完成后重启服务,访问/oidc-principal接口会自动跳转登录,登录完成后即可正常拿到OidcUser实例。
可选验证方式
如果修改后仍有问题,可以在接口中手动从安全上下文取身份信息做排查:
@GetMapping("/oidc-principal") public OidcUser getOidcUserPrincipal() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null && authentication.getPrincipal() instanceof OidcUser) { return (OidcUser) authentication.getPrincipal(); } return null; }
内容的提问来源于stack exchange,提问作者neblaz
相关产品推荐
相关产品推荐

