SpringBoot+OpenAPI:仅Swagger UI需认证、业务API免认证的配置问题
解决方案
问题出在你的Spring Security配置逻辑上:当前的正则规则错误地将业务API纳入了需要认证的范围,同时没有准确匹配springdoc v2对应的Swagger路径。以下是修正后的配置:
1. 修正SecurityFilterChain配置
放弃复杂的正则匹配,改用明确的路径规则,更直观且不易出错:
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { if(swaggerAuthEnabled) { return http.authorizeHttpRequests(authorize -> authorize // 指定Swagger相关路径需要认证 .requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger-ui.html").authenticated() // 允许健康检查路径无需认证 .requestMatchers("/**/health", "/actuator/health").permitAll() // 所有业务API路径允许自由访问 .anyRequest().permitAll()) .httpBasic(Customizer.withDefaults()).build(); } else { // 关闭Swagger认证时,所有路径都允许访问 return http.authorizeHttpRequests(authorize -> authorize.anyRequest().permitAll()) .build(); } }
2. 关键说明
- 路径匹配调整:springdoc v2(适配Spring Boot 3)的Swagger相关默认路径是
/swagger-ui/**(UI页面)和/v3/api-docs/**(OpenAPI文档),你之前使用的/v2/api-docs是Swagger 2.x的旧路径,无法匹配当前版本的接口。 - 逻辑反转:原来的配置是"允许非Swagger路径,其余认证",现在改为"指定Swagger路径需要认证,其余全部允许",完全符合你"仅Swagger UI需要认证"的需求。
- 简化规则:避免使用复杂正则,直接通过
requestMatchers明确指定需要保护的路径,降低维护成本。
3. 验证要点
- 确保
UserDetailsService中配置的密码是经过BCryptPasswordEncoder加密后的字符串(你当前的passwordEncoderBean已经正确配置)。 - 访问Swagger UI时会弹出Basic认证窗口,输入正确的用户名密码后可正常访问。
- 业务API和健康检查路径无需认证,Postman调用时不会返回401错误。
内容的提问来源于stack exchange,提问作者Ashutosh Tripathi
相关产品推荐
相关产品推荐

