Spring Boot - Spring Security CSRF 保护未在登录页面中注入令牌

Posted

技术标签:

【中文标题】Spring Boot - Spring Security CSRF 保护未在登录页面中注入令牌【英文标题】:Spring Boot - Spring Security CSRF protection not injecting token in login page 【发布时间】:2018-07-25 13:38:56 【问题描述】:

我正在关注这个tutorial,但他们已禁用 csrf 保护。

所以我删除了csrf().disabled() 代码,但代码没有被注入,我无法正确登录,因为:

DEBUG 5276 --- [nio-8080-exec-6] o.s.security.web.csrf.CsrfFilter: Invalid CSRF token found for http://localhost:8080/admin_login

我认为由于双重配置(用户和管理员登录)而缺少一些东西。

我已经试过了:

手动添加<input type="hidden" name="$_csrf.parameterName" value="$_csrf.token"/>

th:action 添加到表单标签中。

添加带有th 标签的<input type="hidden" th:name="$_csrf.parameterName" th:value="$_csrf.token" />。这会抛出:Exception evaluating SpringEL expression: "_csrf.parameterName"

有什么想法吗?

【问题讨论】:

【参考方案1】:

把这个元标记放在你的登录页面

<meta name="_csrf" th:content="$_csrf.token"/>
 <meta name="_csrf_header" th:content="$_csrf.headerName"/>

然后,将登录表单中的CSRF令牌作为隐藏参数手动包含在代码中(由于您使用的是Thymeleaf,因此您需要做的是使用th:content而不是content:):

<input
  type="hidden"
  th:name="$_csrf.parameterName"
  th:value="$_csrf.token" />

【讨论】:

试过了,没用。它抛出一个异常。我已经用这个案例更新了帖子。 @FernandoFradegrada 你读过Spring Security Reference。这种方式应该可行。 @FernandoFradegrada 将 thymeleaf-extras-springsecurity 命名空间及其依赖项添加到您的项目中,然后重试。在 html 标签中,添加: xmlns:sec="thymeleaf.org/thymeleaf-extras-springsecurity4" 在您的 pom.xml 中(如果您正在使用 Maven)您需要添加依赖项:thymeleaf-extras-springsecurity4。【参考方案2】:

昨天我使用了你指定的镜头,遇到了类似的问题。我设法解决了这个问题。 thymeleaf 不注入 csrf 代码的原因如下: 你的登录页面和根据文章处理的url是https://www.baeldung.com/spring-security-two-login-pages

.loginPage("/loginAdmin")
.loginProcessingUrl("/admin_login")

但是 antMatchers() 没有规则。 我通过这种方式解决了这个问题: 为 App2ConfigurationAdapter 添加这行代码:

.antMatchers("/loginAdmin", "/admin_login").permitAll()

现在,thymeleaf 将 csrf 代码正确地注入到表单中。

【讨论】:

以上是关于Spring Boot - Spring Security CSRF 保护未在登录页面中注入令牌的主要内容,如果未能解决你的问题,请参考以下文章

UnsatisfiedDependencyException:创建名为“securityConfig”的 bean 时出错

SpringSecurity基于数据库认证

spring security 1

Spring securiuty 过滤器

Spring Boot 学习例子

Spring Boot 2Spring Boot CLI