我正试图通过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相关
对此问题的任何帮助都非常感谢?
答案 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/**");
}