我从具有单独的java config依赖项的Spring Security 3.1.4升级到了包含Java config的新3.2.0版本。CSRF默认情况下处于启用状态,我知道可以使用“ http.csrf()。disable()”在覆盖的configure方法中将其禁用。但是,假设我不想禁用它,但是我需要在登录页面上使用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将从响应标头中获得标头名称或参数名称以及令牌,并将其添加到登录请求中。