Spring Boot集成Keycloak:已提供有效Token仍被要求登录
Spring Boot API 用Keycloak保护时携带Token仍跳登录页问题
问题详情
我尝试用Keycloak结合Spring Security保护Spring Boot API,API运行在端口8080,Keycloak运行在端口8081。
过滤器链配置如下:
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests() .requestMatchers(HttpMethod.POST, "/api/posts*").authenticated() .anyRequest().permitAll() .and() .csrf().disable(); http.oauth2Login() .and() .logout() .logoutSuccessUrl("/"); return http.build(); }
使用Insomnia向/api/posts发起POST请求时,已携带有效访问Token,却仍跳转到登录页面(Insomnia截图显示跳转至登录页)。
application.properties配置:
spring.security.oauth2.client.registration.keycloak.client-id=backend spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code spring.security.oauth2.client.registration.keycloak.scope=openid spring.security.oauth2.client.provider.keycloak.issuer-uri=http://localhost:8081/realms/test spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username
Keycloak客户端配置截图:
问题原因
你当前使用的oauth2Login()是为浏览器端的OAuth2授权码流程设计的,它会触发跳转登录页的逻辑,而非验证请求头中的Bearer Token。API服务需要采用资源服务器模式,用来校验客户端携带的Token合法性。
修复方案
1. 修改SecurityFilterChain配置
替换oauth2Login()为oauth2ResourceServer(),配置JWT验证逻辑:
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth .requestMatchers(HttpMethod.POST, "/api/posts*").authenticated() .anyRequest().permitAll()) .csrf(csrf -> csrf.disable()) .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())); return http.build(); }
2. 调整application.properties配置
添加资源服务器的JWT配置,并根据API场景调整授权类型(推荐使用客户端凭证模式):
spring.security.oauth2.client.registration.keycloak.client-id=backend # API服务推荐使用client_credentials模式获取Token spring.security.oauth2.client.registration.keycloak.authorization-grant-type=client_credentials spring.security.oauth2.client.registration.keycloak.scope=openid spring.security.oauth2.client.provider.keycloak.issuer-uri=http://localhost:8081/realms/test spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username # 配置资源服务器的JWT issuer,Spring Security会自动拉取公钥验证Token spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8081/realms/test
3. Keycloak客户端配置检查
- 确保客户端
backend的Access Type设置为confidential - 开启Service Accounts Enabled(使用client_credentials模式时必须)
- 确认已为客户端或关联用户分配访问
/api/posts接口所需的角色/权限
内容的提问来源于stack exchange,提问作者Absolute1802
相关产品推荐
相关产品推荐

