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

