Spring Security配置异常:无Basic Auth请求未被拦截(未返回401)
嗨,我仔细看了你的Spring Security配置代码,找到了导致“No Auth请求被允许通过”的核心原因:你的配置仅对/app-download/**路径强制要求认证,而其他所有路径默认是允许匿名访问的。这就意味着,如果你调用的API不在/app-download/**这个路径下,Spring Security根本不会拦截它,自然会允许未携带认证信息的请求通过。
具体修复步骤
1. 调整认证规则覆盖所有需要保护的请求
修改filterChain方法里的authorizeRequests配置,确保所有需要Basic Auth保护的请求都被纳入认证检查。如果你的所有API都需要认证,直接添加anyRequest().authenticated()即可;如果只有特定路径需要保护,也可以明确列出,但一定要确保覆盖到你实际调用的API路径。
修正后的filterChain代码:
@Throws(Exception::class) @Bean fun filterChain(httpSecurity : HttpSecurity): SecurityFilterChain { httpSecurity .csrf().disable() // 强制所有请求使用HTTPS .requiresChannel { channel -> channel.anyRequest().requiresSecure() } .authorizeRequests { authorize -> authorize // 如果你只需要保护/app-download/**路径,保留这行 .antMatchers("/app-download/**").authenticated() // 对所有其他请求强制要求认证(根据你的需求调整) .anyRequest().authenticated() } .httpBasic { basic -> basic.authenticationEntryPoint(appAuthenticationEntryPoint) } return httpSecurity.build() }
2. 检查密码配置的属性名(可选但建议)
我注意到你读取密码的@Value用的是${spring.user.password},而Spring Security官方默认的用户密码属性是spring.security.user.password。虽然你说正确的用户名密码能正常返回200,说明你的配置文件里确实是用了spring.user.password,但为了避免后续混淆,建议统一改成标准属性:
@Value("${spring.security.user.password}") private val password : String? = null
3. 关于fullyAuthenticated()和authenticated()的区别
顺便提一句,fullyAuthenticated()会拒绝匿名用户和通过“记住我”功能登录的用户,而authenticated()允许“记住我”用户。如果你的场景不需要区分这两种情况,用authenticated()更通用,这也是我在修复代码里替换它的原因。
验证效果
修改完成后,再用Postman测试:
- 选择No Auth调用API时,会被Spring Security拦截,返回401,符合你的预期;
- 用户名/密码正确返回200、错误返回401的逻辑依然正常工作。
内容的提问来源于stack exchange,提问作者hell_storm2004

