Spring Security配置后请求/user/all返回403而非401的原因咨询
为什么返回403而非401?
Spring Security返回403而不是401,核心原因是你没有配置对应的认证入口(比如Basic Auth的处理逻辑)。
当你配置了/user/**需要authenticated(),但没有告诉Spring Security该用什么方式处理用户的认证请求时,它无法生成WWW-Authenticate响应头来引导客户端(比如浏览器、Postman)发起认证流程,这时就会直接返回403,而不是标准的401未认证响应。
另外你传递了Basic Auth的用户名密码却无效,也是因为缺少处理Basic Auth的过滤器,Spring Security根本没识别到你传的凭证,自然不会触发认证流程,用户始终处于未认证状态,最终被拦截返回403。
解决步骤
开启Basic Auth支持
在你的SecurityFilterChain配置中添加.httpBasic(Customizer.withDefaults()),这样Spring Security会自动添加处理Basic Auth的过滤器,识别请求头里的凭证并触发认证:@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http.csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(a -> a .requestMatchers("/game/**", "/gametype/**", "/publisher/**", "/platform/**").permitAll() .requestMatchers("/user/**").authenticated() .anyRequest().authenticated() // 建议添加默认规则,避免遗漏未匹配的请求 ) .authenticationProvider(authenticationProvider) .sessionManagement(a -> a.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .httpBasic(Customizer.withDefaults()) // 开启Basic Auth .build(); }合并授权规则配置
你原来写了两个.authorizeHttpRequests(),虽然Spring Security允许多次调用,但链式合并成一个更清晰,也能避免潜在的优先级问题(比如后面的规则覆盖前面的)。检查
authenticationProvider的正确性
确保你的authenticationProvider(比如DaoAuthenticationProvider)已经正确配置了UserDetailsService和PasswordEncoder:UserDetailsService要能根据用户名查询到对应的用户信息(包括密码、权限等)PasswordEncoder要和你存储用户密码时使用的加密方式一致,否则密码校验会失败,导致认证不通过。
补充:401和403的区别
- 401 Unauthorized:表示用户未提供有效认证凭证,服务器会返回
WWW-Authenticate头告诉客户端该用什么方式认证(比如Basic、Bearer等)。 - 403 Forbidden:表示用户已经通过认证,但没有访问该资源的权限。但你这里的情况是用户根本没被认证成功,却返回403,本质是因为Spring Security无法引导认证流程导致的。
内容的提问来源于stack exchange,提问作者Phat Vo

