Spring Security生成空CSRF令牌 - 在null上找不到属性或字段'parameterName'

时间:2015-06-15 18:52:30

标签: java spring spring-mvc spring-security spelevaluationexception

我一直在尝试实施Spring Security几天,并且一直在努力使用csrf tokens

我已经调试到CsrfRequestDataValueProcessor并发现以下行返回null。

CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class.getName());

使用Thymeleaf我有以下形式:

<form th:action="@{/j_spring_security_check}" method="post">
  <label for="j_username">Username</label>:
  <input type="text" id="j_username" name="j_username" /> <br />
  <label for="j_password">Password</label>:
  <input type="password" id="j_password" name="j_password" /> <br />
  <input type="submit" value="Log in" />
  <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
</form>

它不会渲染并抛出以下异常:

  

请求处理失败;嵌套异常是org.thymeleaf.exceptions.TemplateProcessingException:评估SpringEL表达式的异常:“_csrf.parameterName”(loginsample:19)],根本原因org.springframework.expression.spel.SpelEvaluationException:EL1007E:(pos 0):属性或字段无法在null

上找到'parameterName'

为什么会这样?

1 个答案:

答案 0 :(得分:1)

您使用的是Java还是XML配置?如果是XML,请确保启用csrf标记:

<http> ... <csrf /> </http>

您可能还需要导入JSP taglib: 导入安全标记:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

然后将其添加到头部:

<sec:csrfMetaTags /> 

您可能需要导入taglib依赖项。