You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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客户端配置截图: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:40:24