当前位置: 首页 > 知识库问答 >
问题:

CookieCsrfTokenRepository.withHttpOnlyFalse()做什么以及何时使用它?

鲁鹤轩
2023-03-14

我现在正在尝试学习Spring Security,我已经看到了许多使用它的不同例子。我知道CSRF是什么,Spring Security默认启用了它。我很想知道的是这种定制。

  .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
  .and()
  .authorizeRequests(request -> {
                request
                    .antMatchers("/login").permitAll()
                    .anyRequest()
                    ....more code

.csrf().csrfTokenRepository(CookieSRFTokenReppository.withHttpOnlyFalse())这一行是什么样的定制,以及何时适合使用它。如果有人能给我一个简单的解释,我将不胜感激。

共有2个答案

司空坚
2023-03-14

您可以在此处找到有关Cookie的httpOnly属性的其他信息:https://www.cookiepro.com/knowledge/httponly-cookie/

松德曜
2023-03-14

CSRF代表跨站点请求伪造

它是一种与请求一起发送的令牌,以防止攻击。为了使用Spring Security CSRF保护,我们首先需要确保对任何修改状态的东西(PATCHPOSTPUTDELETE - 而不是GET)使用正确的HTTP方法。

SpringCookiesRFTokenReposition的CSRF保护工作如下:

  • 客户端向Server(Spring Boot Backend)发出GET请求,例如请求主页
  • Spring发送GET请求的响应以及Set-cookie标头,其中包含安全生成的XSRF Token
  • 浏览器使用XSRF令牌设置cookie
  • 在发送状态更改请求(例如POST)时,客户端(可能是角的)将cookie值复制到HTTP请求标头
  • 请求与标头和cookie一起发送(浏览器自动附加cookie)
  • Spring比较标头和cookie值,如果它们相同则接受请求,否则将403返回给客户端

使用HttpOnlyFalse的方法允许angular读取XSRF cookie。确保 Angular 在将凭据标志设置为 true 的情况下发出 XHR 请求。

来自< code > cookiesrftokenrepository 的代码

@Override
public CsrfToken generateToken(HttpServletRequest request) {
    return new DefaultCsrfToken(this.headerName, this.parameterName,
            createNewToken());
}

@Override
public void saveToken(CsrfToken token, HttpServletRequest request,
        HttpServletResponse response) {
    String tokenValue = token == null ? "" : token.getToken();
    Cookie cookie = new Cookie(this.cookieName, tokenValue);
    cookie.setSecure(request.isSecure());
    if (this.cookiePath != null && !this.cookiePath.isEmpty()) {
            cookie.setPath(this.cookiePath);
    } else {
            cookie.setPath(this.getRequestContext(request));
    }
    if (token == null) {
        cookie.setMaxAge(0);
    }
    else {
        cookie.setMaxAge(-1);
    }
    cookie.setHttpOnly(cookieHttpOnly);
    if (this.cookieDomain != null && !this.cookieDomain.isEmpty()) {
        cookie.setDomain(this.cookieDomain);
    }

    response.addCookie(cookie);
}

@Override
public CsrfToken loadToken(HttpServletRequest request) {
    Cookie cookie = WebUtils.getCookie(request, this.cookieName);
    if (cookie == null) {
        return null;
    }
    String token = cookie.getValue();
    if (!StringUtils.hasLength(token)) {
        return null;
    }
    return new DefaultCsrfToken(this.headerName, this.parameterName, token);
}


public static CookieCsrfTokenRepository withHttpOnlyFalse() {
    CookieCsrfTokenRepository result = new CookieCsrfTokenRepository();
    result.setCookieHttpOnly(false);
    return result;
}

你可以在这里探索方法

 类似资料:
  • 问题内容: 抱歉,如果我有点模棱两可,但是我试图了解使用Node.js而不是其他服务器端语言的真正优势。 我是JavaScript爱好者,所以我可能会玩Node.js,但我想知道是否应该在项目中使用它。 问题答案: 在V8上发生了异步非阻塞I / O 构建。 因此,我们拥有了Google JavaScript解释器V8的所有性能提升。由于JavaScript性能竞赛尚未结束,您可以期望Google

  • 帮助文档写道: 将本地setup.py安装到您的虚拟环境/Pipfile中: $ pipenv install -e . 有人可以进一步详细说明何时以及如何使用命令与 有关? 根据,

  • 我看到它包含了DejaVu Sans字体,但我不知道如何使用这个jar(我在网上什么也没有找到),也不知道这是否能以一种优雅、简单的方式解决我的跨平台软件。 你能告诉我更多关于这个罐子的事吗?

  • 当我尝试 结果给我一个二维绘图框架,x轴从0到1。然而,当我尝试使用来切片向量时, 除了将行向量更改为列向量之外,它是同样的事情吗? 一般来说,,我们应该在什么情况下使用它?

  • 问题内容: 有人向我解释什么和是谁? 我感到困惑的用例都和。 如果您还可以包括一段代码来进行解释,那将是很好的。谢谢! 问题答案: 的目标和是抽象不同的方式来输入和输出:流是一个文件,网页,或者屏幕不应该的事。重要的是您从流中接收信息(或将信息发送到该流中。) 用于阅读许多内容。 用于写很多东西。 这是一些示例代码。它假定和已经创建:

  • 问题内容: 经常出现在Python模块中。即使阅读了Python的文档,我也不明白它的用途以及使用时间/方式。 有人可以举例说明吗? 关于我收到的基本用法的一些答案似乎是正确的。 但是,我需要了解有关工作原理的另一件事: 对我来说,最令人困惑的概念是当前的python版本如何包含未来版本的功能,以及如何使用当前版本的Python成功地编译使用未来版本的功能的程序。 我猜想当前版本包含了将来的潜在功