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 时出错