未找到预期的CSRF令牌。你的会话已经过期了吗? + Spring安全+ CSRF

时间:2015-09-14 14:50:01

标签: spring-security csrf-protection

我正试图通过Spring security实现CSRF。

但是,点击登录按钮(来自home.jsp)后,在浏览器中面对跟随错误

"未找到预期的CSRF令牌。您的会话是否已过期?"

我在

中有以下配置

弹簧安全-config.xml中:

<http auto-config="false">
<csrf/>
</http>

针对home.jsp:

<form action="j_spring_security_check" id="LoginForm" method="post">       
    <input type="text" title="Username" name="j_username" id="j_username" 
           class="inset-shadow defaultText" placeholder="Username" />
    <input type="password" title="Password" name="j_password" 
           id="j_password" class="inset-shadow defaultText" placeholder="Password" />
    <input type="submit" class="submit" title="LOGIN" 
           onsubmit="javascript:{loginSubmit();}"/>
    <input type="hidden" name="_csrf" value="dc7ce2be-f73b-4086-8f90-8ef00b8f81d5"/>    
</form>

jboss server.log出错:

2015-09-14 19:56:10,221 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/].[jsp]] (http-127.0.0.1-8190-2) Servlet.service() for servlet jsp threw exception: java.lang.IllegalStateException: getAttribute: Session already invalidated
    at org.apache.catalina.session.StandardSession.getAttribute(StandardSession.java:1024) [:6.1.0.Final]
    at org.apache.catalina.session.StandardSessionFacade.getAttribute(StandardSessionFacade.java:110) [:6.1.0.Final]
    at org.apache.jsp.WEB_002dINF.jsp.home_jsp._jspService(home_jsp.java:99)

注意:不确定server.log中的错误是否与CSRF相关

对此问题的任何帮助都非常感谢?

2 个答案:

答案 0 :(得分:2)

而不是

<input type="hidden" name="_csrf" value="dc7ce2be-f73b-4086-8f90-8ef00b8f81d5"/>
你试过

吗?
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

根据文档,csrf和token将由Spring计算并附加为请求参数,名称为${_csrf.parameterName},值为${_csrf.token}

答案 1 :(得分:1)

我遇到了同样的错误。

我的情况是,包含表单的html页面在我的Web应用程序中有一个css文件的链接标记。 这个到css文件的链接也受到spring security的保护,因此我发现了你的错误。

当我取消保护到css文件的链接时,不会发生错误。

这是一个如何使用Java Config在Spring Security中取消保护文件的示例

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/css/**");
}