一尘不染

使用Spring Security 3.2.0.RELEASE,如何在没有标签库的纯HTML页面中获取CSRF令牌

spring

我从具有单独的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令牌。你的会话是否已过期?” 例外?


阅读 364

收藏
2020-04-19

共1个答案

一尘不染

你可以获取使用名为_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将从响应标头中获得标头名称或参数名称以及令牌,并将其添加到登录请求中。

2020-04-19