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
相关产品推荐
相关产品推荐

