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

Spring Security 6中如何开启RFC7807风格的JWT无效响应体?

Spring Security 6 开启RFC7807风格ProblemDetails错误响应体

问题描述

我遇到了Spring 6引入的RFC7807 ProblemDetails类型与Spring Security 6 JWT令牌验证的相关问题:

预期行为:
向受保护端点提供无效令牌时,应用应返回401状态码及ProblemDetails格式的响应体,但我没找到对应的开启配置项。

实际行为:
提供无效令牌后,应用仅返回401状态码,无任何响应体。

我的SecurityFilterChain Bean代码示例如下:

@Bean
SecurityFilterChain filterChain(HttpSecurity httpSecurity, NTKeycloakAuthProperties ntKeycloakAuthProperties) throws Exception {

        return httpSecurity
                .csrf(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> {
                    authorizationManagerRequestMatcherRegistry.requestMatchers("/secured/**").authenticated();
                    authorizationManagerRequestMatcherRegistry.requestMatchers("/**").permitAll();
                })
                .oauth2ResourceServer(httpSecurityOAuth2ResourceServerConfigurer -> {
                    httpSecurityOAuth2ResourceServerConfigurer.authenticationManagerResolver(
                            new JwtIssuerAuthenticationManagerResolver(ntKeycloakAuthProperties.getIssuers())
                    );
                })
                // 疑问:是否有预构建、易配置的方式来开启RFC7807类型的错误响应体?
                .build();
    }

核心问题:使用Spring Security 6时,能否开启RFC7807风格的错误响应体?


解决方案

可以开启,Spring Security 6提供了内置支持,无需复杂自定义,只需两步配置:

1. 启用Spring MVC的ProblemDetails基础支持

如果项目未启用Spring MVC自动配置,可在配置类上添加@EnableWebMvc;或者直接通过配置文件开启:

spring.mvc.problemdetails.enabled=true

2. 配置Spring Security使用ProblemDetails处理认证/授权异常

在SecurityFilterChain中添加exceptionHandling配置,指定使用内置的ProblemDetails实现类处理认证、授权异常:

修改后的SecurityFilterChain代码如下:

@Bean
SecurityFilterChain filterChain(HttpSecurity httpSecurity, NTKeycloakAuthProperties ntKeycloakAuthProperties) throws Exception {

        return httpSecurity
                .csrf(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> {
                    authorizationManagerRequestMatcherRegistry.requestMatchers("/secured/**").authenticated();
                    authorizationManagerRequestMatcherRegistry.requestMatchers("/**").permitAll();
                })
                .oauth2ResourceServer(httpSecurityOAuth2ResourceServerConfigurer -> {
                    httpSecurityOAuth2ResourceServerConfigurer.authenticationManagerResolver(
                            new JwtIssuerAuthenticationManagerResolver(ntKeycloakAuthProperties.getIssuers())
                    );
                })
                .exceptionHandling(exceptionHandling -> {
                    // 处理无效JWT等认证异常,返回ProblemDetails格式的401响应
                    exceptionHandling.authenticationEntryPoint(new ProblemDetailsAuthenticationEntryPoint());
                    // 处理权限不足的授权异常,返回ProblemDetails格式的403响应
                    exceptionHandling.accessDeniedHandler(new ProblemDetailsAccessDeniedHandler());
                })
                .build();
    }

配置完成后,提供无效JWT令牌时,应用会返回如下格式的401响应体:

{
  "type": "about:blank",
  "title": "Unauthorized",
  "status": 401,
  "detail": "Invalid JWT token",
  "instance": "/secured/your-endpoint"
}

版本兼容说明

  • ProblemDetailsAuthenticationEntryPoint和ProblemDetailsAccessDeniedHandler是Spring Security 6.1及以上版本引入的内置类;
  • 若使用Spring Security 6.0版本,需要自定义AuthenticationEntryPoint和AccessDeniedHandler,手动构建ProblemDetails对象并写入响应体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:55:15