今天我从具有独立java配置依赖性的Spring Security 3.1.4升级到包含java config的新3.2.0版本.CSRF默认打开,我知道我可以在我的重写配置方法中使用"http.csrf().disable()"禁用它.但是假设我不想禁用它,但我需要在登录页面上使用CSRF令牌,其中没有使用JSP标记库或Spring标记库.
我的登录页面纯粹是HTML,我在使用Yeoman生成的Backbone应用程序中使用.我如何在表单中或作为标题包含HttpSession中包含的CSRF令牌,这样我就不会得到"未找到预期的CSRF令牌.您的会话是否已过期?" 例外?
您可以使用参考中概述的名为_csrf的请求属性获取CSRF .要将CSRF添加到HTML页面,您需要使用JavaScript来获取需要包含在请求中的令牌.
将标记作为标题返回比使用JSON在主体中更安全,因为正文中的JSON可以通过外部域获取.例如,您的JavaScript可以请求由以下处理的URL:
CsrfToken token = (CsrfToken) request.getAttribute("_csrf"); // Spring Security will allow the Token to be included in this header name response.setHeader("X-CSRF-HEADER", token.getHeaderName()); // Spring Security will allow the token to be included in this parameter name response.setHeader("X-CSRF-PARAM", token.getParameterName()); // this is the value of the token to be included as either a header or an HTTP parameter response.setHeader("X-CSRF-TOKEN", token.getToken());
然后,您的JavaScript将从响应标头获取标头名称或参数名称以及令牌,并将其添加到登录请求中.