【问题标题】:built in method for retrieving csrf token用于检索 csrf 令牌的内置方法
【发布时间】:2019-07-22 21:52:32
【问题描述】:

我在 Spring Security 3.2.9.RELEASE 中启用了 csrf。我在网上找到了这些获取 csrf 令牌的选项:

include token is http response headers

手动创建一个 GET api 来检索它

@RequestMapping(method = RequestMethod.GET, value = "/csrf")
    public @ResponseBody String retrieveCsrfToken(HttpServletRequest request) throws Exception {
        if (null != request.getSession(false)) {
            System.out.println("session exist ");
        }
        CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
        return token.getToken();
    }

是否没有内置机制来检索它?
获取令牌的预期默认方式是什么?

所有其他 csrf 功能已经编码/内置(由 spring)除了如何获取令牌的这一块。我觉得我错过了什么。

【问题讨论】:

    标签: java spring-security csrf


    【解决方案1】:

    spring-security-web 模块允许通过引用$_csrf 参数来访问视图中的 CSRF 令牌。根据6.4.3. Include the CSRF Token docs,这可以作为表单提交的一部分来完成:

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

    或存储在&lt;meta&gt;标签中:

    <meta name="_csrf" content="${_csrf.token}"/>
    <meta name="_csrf_header" content="${_csrf.headerName}"/>
    

    通过 JavaScript 进一步阅读:

    $(function () {
      var token = $("meta[name='_csrf']").attr("content");
      var header = $("meta[name='_csrf_header']").attr("content");
      $(document).ajaxSend(function(e, xhr, options) {
        xhr.setRequestHeader(header, token);
      });
    });
    

    【讨论】:

      猜你喜欢
      • 2020-10-29
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 2019-01-13
      • 2019-02-20
      • 2013-02-25
      • 2014-05-01
      • 2015-05-10
      相关资源
      最近更新 更多