Spring Security禁用httpBasic后仍返回WWW-Authenticate头弹出认证窗口
问题原因
这不是Spring Security的Bug,属于默认配置的预期行为,具体原因如下:
- 你仅禁用了HTTP Basic的认证过滤器,没有修改Spring Security默认的认证失败处理逻辑。当
authManager抛出AccessDeniedException返回401未认证状态时,WebFlux环境下默认使用的HttpBasicServerAuthenticationEntryPoint会自动在响应头添加WWW-Authenticate: Basic realm="Realm"字段。 - 浏览器只要检测到401响应携带上述
WWW-Authenticate头,就会自动触发HTTP Basic认证弹窗,和你是否开启HTTP Basic的认证校验逻辑无关。
验证方法
你可以用curl或者Postman直接调用受保护接口,查看401响应的响应头,会明确看到WWW-Authenticate: Basic字段,就是这个字段触发了浏览器的弹窗。
解决方案
在你的httpTestFilterChain配置中追加异常处理配置,覆盖默认的认证入口点,返回401时不添加WWW-Authenticate头即可:
@Bean fun httpTestFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain { http .authorizeExchange() .pathMatchers("/actuator/**").permitAll() .pathMatchers("/webjars/swagger-ui/**", "/v3/api-docs/**").permitAll() .anyExchange().access(authManager) .and().cors() .and() .httpBasic().disable() .formLogin().disable() .csrf().disable() .logout().disable() // 追加下面的异常处理配置 .exceptionHandling() .authenticationEntryPoint { exchange, _ -> exchange.response.statusCode = HttpStatus.UNAUTHORIZED // 如果需要返回自定义错误信息,可以在这里写入响应体 exchange.response.setComplete() } return http.build() }
内容的提问来源于stack exchange,提问作者JVVLadimir
相关产品推荐
相关产品推荐

