CSRF - 仅在第一次登录

2024-03-20

当我在服务器上部署我的应用程序时,第一次我可以毫无问题地登录。但是当我注销时,我在注销发布请求中收到“403 Forbidden”。然后我无法成功登录,因为我在登录请求上收到 403 错误。 Ctrl+F5,尝试再次登录......它可以工作,但只能一次。

    @Override
    protected void configure(HttpSecurity http) throws Exception {
http
                .authorizeRequests()
                .antMatchers("/apps", "/sites", "/users").authenticated()
                .and()
                .csrf()
                .csrfTokenRepository(csrfTokenRepository())
                .and()
                .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
}
private CsrfTokenRepository csrfTokenRepository() {
    HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
    repository.setHeaderName("X-XSRF-TOKEN");
    return repository;
}

和 CsrfHeaderFilter 类:

public class CsrfHeaderFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class
                .getName());
        response.setHeader("X-CSRF-HEADER", token.getHeaderName());

        response.setHeader("X-CSRF-PARAM", token.getParameterName());

        response.setHeader("X-XSRF-TOKEN", token.getToken());

        if (token != null) {
            Cookie cookie = WebUtils.getCookie(request, "X-XSRF-TOKEN");
            if (cookie == null || token != null && !token.equals(cookie.getValue())) {
                cookie = new Cookie("X-XSRF-TOKEN", token.getToken());
                cookie.setPath("/");
                response.addCookie(cookie);
            }
        }
        filterChain.doFilter(request, response);
    }

和角度:

$httpProvider.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';

如果重要的话,我的应用程序部署在 localhost:8080/myApp 上。


在某些事件之后,例如login, logout,CSRF 令牌发生变化。因此,下一个 POST 请求将失败,就像您的情况一样。我遇到了同样的问题,经过一番诊断后,发现发送另一个 GET 请求如下login, logout等等将是解决这个问题的最好方法。 (如果您没有使用 CORS,您也可以使用login, logout发送重定向响应)。看这个 stackoverflow 帖子 https://stackoverflow.com/questions/31654565/spring-single-page-application-csrf-token-changing-silently-after-login-logout更多细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSRF - 仅在第一次登录 的相关文章

随机推荐

  • hibernate使用注释或使用hibernate配置文件

    我看过很多使用注释 基本上是hibernate注释或JPA注释 来实现hibernate的教程 有教程主要关注使用hibernate配置文件 hbm xml文件 根本没有使用注释 现在我有点困惑 哪种方法更好 我绝对更喜欢使用注释来定义我的
  • sinon 存根 withArgs 可以匹配部分参数但不是全部参数

    我有一个正在存根的函数 该函数会使用多个参数进行调用 我想检查一下只是第一个参数 其余的都是回调函数 所以我不想管它们 因此 我可能有以下 2 个调用 以 ajax 为例 method get sinon stub method get 2
  • Groovy HTTPBuilder:从 GZIPed 分块响应中获取实体内容

    我需要向 Web 服务器发送 POST 请求 并能够读取该服务器发送的响应 我尝试使用 HTTPBuilder lib 和以下代码 def http new HTTPBuilder http myServer http setProxy P
  • 更改 Laravel 5.2 中的登录/注册 URL

    我目前正在编写一个应用程序 该应用程序仅包含公司员工的帐户 而不包含常规网站访问者的帐户 因此 我想将与网站 管理 区域相关的 URL 保留在 admin URL 下 这意味着更改 login to admin login and regi
  • 获取一个 url 参数的数组

    我想获取 url param id 但它不起作用 这里每个人都可以帮助我吗 下面的代码不起作用 Url http localhost 9000 rest alerts ids 123 ids 456 路由配置文件 GET restws al
  • Excel-VBA:需要变量声明吗?

    如果写下面的代码会不会出错 Sub Something Dim i As integer Dim xRange As Range Dim yRange As Range Set xRange Range x table Set yRange
  • 控制 R 散点图中点的大小?

    在 R 中 plot 函数需要一个pch控制图中点的外观的参数 我正在制作具有数万个点的散点图 并且更喜欢一个小但不是太小的点 基本上 我发现pch 太小了 但是pch 19太胖了 中间有什么东西或者有什么方法可以以某种方式缩小这些点吗 A
  • 自定义 ASP.NET 身份

    我正在使用 Identity Server 4 并且已自定义 ASP NET Identity 用户 如下所示 public class ApplicationUser IdentityUser MaxLength 100 public v
  • Java 默认版本在 PATH 更改后不反映

    我当前正在 Java 1 7 0 17 64 位版本上运行 我想使用 Java 32 位版本启动一个应用程序 我更新了 PATH 变量以指向 C Program Files x86 Java jre7 bin Java 32 位版本 然后做
  • 如何在不设置内置错误的情况下触发 mat-date-range-input 的 mat-form-field 中 mat-error 的显示?

    根据问题 我有一个日期范围选择器start and end日期作为mat form field 我想执行自定义验证 例如 确保之间的绝对差异start and end不超过 15 天 并显示mat error在 的里面mat form fi
  • Groovy - 如何延迟 Groovlet 修改重新编译检查

    我是 Groovy 的新手 我正在考虑使用 Groovlets 不是 GRAILS 来替换一些 Servlet 如果我更改 Groovlet 的脚本文件 Groovlet 会重新编译并自动获取更改 包括从 Groovlet 引用的脚本 这对
  • 具有离散值的圆形 SeekBar

    我正在尝试创建一个具有离散非线性值的圆形搜索栏 我还希望这些值出现在圆圈之外 我从 GitHub 上查看了多个版本 其中最有希望的是JesusM https github com JesusM HoloCircleSeekBar但是 我想不
  • Emacs 是否可以运行位于远程服务器上的 Matlab shell?

    我希望能够使用 Matlab 模式 matlab el 来运行 matlab shell 唯一的问题是 Matlab 位于远程主机上 这可能吗 如果是这样 请解释一下 我现在正在和流浪汉玩 但没有成功 Thanks 我刚刚尝试通过 ssh
  • Task.Factory.StartNew 与 Task.Factory.FromAsync

    假设我们有一个 I O 绑定方法 例如进行数据库调用的方法 该方法可以同步和异步运行 那是 Sync IOMethod Async BeginIOMethod EndIOMethod 那么当我们以如下所示的不同方式执行该方法时 在资源利用率
  • 非平凡可复制类型的 C++ 值表示

    C 标准的当前草案 2019 年 3 月 有以下段落 basic types p 4 强调我的 T 类型对象的对象表示是 T 类型对象占用的 N 个 unsigned char 对象的序列 其中 N 等于 sizeof T T 类型对象的值
  • 在 JavaScript 块上使用 HTML 注释仍然有意义吗?

    过去 人们习惯将 HTML 注释标签包裹在 JavaScript 块周围 以防止 旧 浏览器显示脚本 即使 Lynx 足够聪明 可以忽略 JavaScript 那么为什么有些人仍然这样做呢 这些天有什么正当理由吗 编辑 我确实遇到过一种情况
  • 检查是否可以安全地评估符号

    我有一根绳子x 我觉得x是某个类型的子类型的字符串表示形式Number 例如 x可能会取值 Float64 我可以使用以下方法检查这一点 eval parse x lt Number 然而 有可能x包含一些危险的东西 比如一些变体 rm s
  • textFieldDidBeginEditing:没有被调用

    我从下面得到了代码this https stackoverflow com questions 1247113 iphone keyboard covers uitextfield所以问题 当我开始编辑时 我试图向上滑动文本字段 因为否则它
  • MySQL INT 含义

    我想知道如果我采用值为 8 的 INT 这是否意味着我只能从 1 到 99999999 或从 1 到 4294967295 UNSIGNED 该文档似乎对此非常清楚 数字类型属性 MySQL 支持选择性指定显示的扩展 基关键字后面的括号中的
  • CSRF - 仅在第一次登录

    当我在服务器上部署我的应用程序时 第一次我可以毫无问题地登录 但是当我注销时 我在注销发布请求中收到 403 Forbidden 然后我无法成功登录 因为我在登录请求上收到 403 错误 Ctrl F5 尝试再次登录 它可以工作 但只能一次