Spring Boot Starter Security排除/api路径失效,请求返回401问题问询
嘿,我来帮你拆解下这个问题的根源,以及怎么解决它:
核心问题:路径匹配规则写错了
你当前配置的web.ignoring().antMatchers("/api*")并没有覆盖所有你想忽略的路径。Spring Security使用的Ant风格路径匹配规则里,*只能匹配任意非斜杠的字符,也就是说:
- 它能匹配
/api、/apia这类路径,但无法匹配/api/、/api/users这类包含斜杠的子路径。
如果你的RestController接口是/api/xxx格式,或者Spring MVC自动把/api重定向到/api/(比如控制器上的@RequestMapping是/api/),这些路径就不会被/api*匹配到,进而触发Spring Security的默认安全规则——要求所有请求必须认证,所以返回了401。
另外,你没有重写configure(HttpSecurity http)方法,此时Spring Security会启用默认配置:所有请求都需要认证。如果你的路径没被web.ignoring()正确匹配,就会被这个默认规则拦截。
解决方案
1. 修正路径匹配规则
把/api*改成/api/**,这样就能匹配所有以/api开头的路径(包括/api、/api/、/api/xxx等):
@Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/api/**"); }
2. 补充完整的HttpSecurity配置(可选但推荐)
为了避免默认规则的干扰,建议重写configure(HttpSecurity http)方法,明确指定非/api路径需要认证,/api路径允许匿名访问:
@Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/api/**").permitAll() // 允许/api下所有路径匿名访问 .anyRequest().authenticated() // 其他所有路径需要认证 .and() .formLogin() // 启用表单登录(如果需要的话) .and() .httpBasic(); // 启用HTTP Basic认证,对应你配置的内存用户 }
小提示:
web.ignoring()是让路径完全绕过Spring Security的过滤器链,性能更优;而permitAll()是让路径经过过滤器链但允许匿名访问。如果你的/api路径不需要任何安全处理(比如CSRF防护),优先用web.ignoring()。
验证修改
修改配置后,重新运行你的测试方法:
@Test public void testStatus200() throws Exception{ mvc.perform(get("/api")).andExpect(status().isOk()); }
此时应该能正常返回200状态码了。
内容的提问来源于stack exchange,提问作者Alex Foglia

