Spring Security 3.2升级到5.8时表单登录出现403/404问题
Spring Security 3.2升级到5.8的登录配置问题
我正在将应用从Spring Security 3.2升级到5.8。按照官方XML文档配置后遇到两个问题:
- 未添加
<security:http security="none" pattern="/dologin" />时,访问/dologin会出现403错误; - 添加该配置后,又出现404错误。
我的form-login配置如下:
<security:form-login login-page="/login" login-processing-url="/dologin" default-target-url="/secure/user/dashboard" always-use-default-target='true' authentication-failure-url="/login?error" />
相关DEBUG日志信息:
DEBUG: org.springframework.security.web.context.SecurityContextPersistenceFilter - Cleared SecurityContextHolder to complete request DEBUG: org.springframework.security.web.FilterChainProxy - Securing POST /dologin DEBUG: org.springframework.security.web.context.SecurityContextPersistenceFilter - Set SecurityContextHolder to empty SecurityContext DEBUG: org.springframework.security.web.csrf.CsrfFilter - Invalid CSRF token found for http://localhost:8080/dologin DEBUG: org.springframework.security.web.access.AccessDeniedHandlerImpl - Responding with 403 status code DEBUG: org.springframework.security.web.context.HttpSessionSecurityContextRepository - Did not store empty SecurityContext
问题分析与解决
从日志能直接看出,403的核心原因是CSRF令牌无效。Spring Security 4及以上版本默认启用了CSRF保护,而3.2版本默认关闭,这是升级后触发问题的关键。
解决403错误
别加security="none"的配置,/dologin是Spring Security登录过滤器专门处理的路径,不能排除在安全链外。正确操作是在登录页面的表单里添加CSRF令牌:
在/login页面的form表单中插入以下代码:
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
表单提交时携带这个令牌,就能通过CSRF校验,解决403问题。
为什么加security="none"会出404
一旦把/dologin设为security="none",Spring Security的过滤链就不会处理这个请求,而你的应用里又没有自定义控制器来接收/dologin的POST请求,自然返回404。必须让Spring Security的登录过滤器处理这个路径,所以不能排除它。
额外提示
- 确保登录表单的提交方法是
POST,且提交路径和login-processing-url配置的/dologin完全一致; - 如果你的应用是纯后端服务(无前端表单提交),确实不需要CSRF保护(不推荐面向用户的应用这么做),可以在http配置里关闭CSRF:
<security:http> <!-- 其他原有配置 --> <security:csrf disabled="true" /> </security:http>
内容的提问来源于stack exchange,提问作者JustinKSU
相关产品推荐
相关产品推荐

