React使用Axios携带密码认证Spring+外部LDAP时出现403错误
问题排查与解决方案
1. 请求方法与路径不匹配
你的Spring Security配置仅要求GET请求/api/user/test需要认证:
.requestMatchers(HttpMethod.GET, "/api/user/test").authenticated()
但前端发送的是POST请求到/user/test(缺少/api前缀):
axios.post(`${apiurl}/user/test`,{}, ...)
这会导致:
- POST请求
/user/test匹配anyRequest().permitAll(),但如果后端未开放该路径的POST接口,或接口有其他权限控制,会返回403; - 路径前缀不一致导致认证规则未生效,引发权限问题。
解决办法:
- 统一请求路径:前端改为
${apiurl}/api/user/test,并确保请求方法与后端接口一致(若后端是GET接口则用axios.get); - 调整Security配置:若需要POST请求也认证,修改为:
.requestMatchers(HttpMethod.GET, "/api/user/test") .requestMatchers(HttpMethod.POST, "/api/user/test").authenticated()
2. CSRF防护拦截POST请求
Spring Security默认开启CSRF防护,POST等非幂等请求需携带CSRF Token才能通过验证。你的API Key配置中关闭了CSRF,但HTTP Basic配置未关闭,导致POST请求被拦截返回403。
解决办法:
纯API场景下可直接关闭CSRF:
http .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(authorize -> authorize .requestMatchers(HttpMethod.GET, "/api/user/test").authenticated() .anyRequest().permitAll()) .httpBasic(Customizer.withDefaults());
若需保留CSRF,需在前端请求中携带CSRF Token:从Cookie提取XSRF-TOKEN,并在请求头添加X-XSRF-TOKEN。
3. LDAP用户匹配规则不匹配
你的LDAP配置使用userSearchFilter("(uid={0})"),即通过uid字段匹配用户,但前端传递的用户名是abc,需确认LDAP中该用户的uid是否确实为abc(而非cn或其他字段)。
若表单登录正常但HTTP Basic失败,可能是表单登录用cn匹配,而HTTP Basic用uid匹配导致找不到用户,认证失败后返回403。
解决办法:
- 检查LDAP用户属性,确保
uid字段值为abc; - 若需用
cn匹配用户,修改LDAP配置:
.userSearchFilter("(cn={0})")
4. 开启认证日志排查细节
添加Spring Security DEBUG日志,查看认证过程中的具体错误:
在application.properties中配置:
logging.level.org.springframework.security=DEBUG
通过日志可明确是认证失败、权限不足还是其他原因导致的403。
内容的提问来源于stack exchange,提问作者Man Man Yu
相关产品推荐
相关产品推荐

