You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security自定义登录路径异常:更换路径后无法完成授权

问题分析与解决方案

你的问题核心是登录表单提交后被拦截,导致认证失败重定向回登录页,并非登录路径必须为/login,主要原因及修复方式如下:

1. 表单缺少CSRF令牌

Spring Security默认启用CSRF防护机制,自定义登录表单必须包含CSRF令牌字段,否则POST请求会被直接拦截,触发认证失败重定向。

修复方式

在Thymeleaf表单中添加自动生成的CSRF令牌:

<form method="POST" th:action="@{/login}">
  <!-- 新增CSRF令牌字段 -->
  <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
  
  <div>
    <input type="text" name="username" id="username" placeholder="Username" />
  </div>
  <div>
    <input type="password" name="password" id="password" placeholder="Password" />
  </div>
  <input type="submit" value="Log in" />
</form>

2. 登录处理路径配置不匹配

如果你希望表单提交到自定义的/signin路径(而非默认的/login),需要显式告诉Spring Security处理该路径的登录请求。

修复步骤

第一步:修改表单提交路径

<form method="POST" th:action="@{/signin}">
  <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
  <!-- 其余表单字段不变 -->
</form>

第二步:更新Spring Security配置

添加loginProcessingUrl指定登录请求处理路径:

http.formLogin(form -> {
    form.loginPage("/signin").permitAll();
    // 指定处理登录POST请求的路径
    form.loginProcessingUrl("/signin");
    form.defaultSuccessUrl("/files");
});

关键说明

  • 登录页面的路径完全可以自定义,不需要固定为/login,只要保证:
    • 登录页面的GET请求能被匿名访问(你已经通过permitAll()实现)
    • 表单提交路径与Spring Security配置的loginProcessingUrl一致
    • 表单包含CSRF令牌(除非你明确禁用CSRF,不推荐生产环境这么做)

内容的提问来源于stack exchange,提问作者Joaquinm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:56:04