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

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加密后的字符串(你当前的passwordEncoder Bean已经正确配置)。
  • 访问Swagger UI时会弹出Basic认证窗口,输入正确的用户名密码后可正常访问。
  • 业务API和健康检查路径无需认证,Postman调用时不会返回401错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:13:11