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

Spring 3集成Keycloak如何启用bearer-only模式,返回403而非跳转登录?

Spring 3集成Keycloak启用bearer-only认证模式

问题背景

希望在Spring 3与Keycloak集成时启用bearer-only认证模式:仅通过校验JWT令牌完成身份认证,当请求不带令牌时返回403 Forbidden,而非跳转到Keycloak登录页。当前配置下未达到预期效果,相关配置如下:

当前SecurityFilterChain配置

@Bean
public SecurityFilterChain configure(HttpSecurity http) throws Exception {
    http.oauth2Login()
            .and()
            .csrf().disable();

    http.oauth2ResourceServer().jwt();
    http
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.ALWAYS);

    http
            .authorizeHttpRequests()
            .requestMatchers("/test").permitAll()
            .anyRequest().authenticated();

    return http.build();
}

当前application.yml配置

spring:
  security:
    oauth2:
      client:
        registration:
          keycloak:
            client-id: paper_java
            client-secret: JEEcO8mJhKzkcx2aZ2sgZ8E2JsSx4Lms
            scope: openid
            authorization-grant-type: authorization_code
        provider:
          keycloak:
            issuer-uri: http://localhost:9999/realms/ss
            user-name-attribute: preferred_username
      resourceserver:
        jwt:
          issuer-uri: http://localhost:9999/realms/ss

解决方案

1. 移除OAuth2登录配置

配置中的oauth2Login()是OAuth2授权码模式的登录逻辑,会在未认证时触发跳转登录页的行为,需要完全移除这部分配置。

2. 精简application.yml配置

bearer-only模式下,应用仅作为资源服务器校验JWT令牌,不需要客户端注册信息,因此可以删除spring.security.oauth2.client相关配置。

3. 调整会话策略

由于是无状态的令牌认证,建议将会话创建策略设置为SessionCreationPolicy.STATELESS,避免不必要的会话创建。

修改后的SecurityFilterChain配置

@Bean
public SecurityFilterChain configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
            .oauth2ResourceServer(oauth2 -> oauth2.jwt())
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(auth -> auth
                    .requestMatchers("/test").permitAll()
                    .anyRequest().authenticated());

    return http.build();
}

修改后的application.yml配置

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://localhost:9999/realms/ss

验证效果

修改配置后重启应用:

  • 不带令牌请求受保护接口时,会返回403 Forbidden响应
  • 携带有效JWT令牌(通过Authorization: Bearer <token>请求头传递)时,可正常访问接口

内容的提问来源于stack exchange,提问作者kifor4ik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:07:51