cakephp 蛋糕PHP 3.7.3:将SecurityComponent与 AJAX 和SPA结合使用

bbuxkriu  于 2022-11-12  发布在  PHP
关注(0)|答案(1)|浏览(107)

这 是 启用 了 SecurityComponent 的 ajax 请求 的 一 个 典型 问题 。 我 主要 有 一 个 SPA 。 这 是 主要 问题 。
我 还 使用 了 CSRF 组件 , 该 组件 工作 正常 :

const response = await axios.post("/items/add.json", data, {
  headers: {"X-CSRF-Token": "<?= $this->getRequest()->getParam('_csrfToken') ?>"}
});

中 的 每 一 个
不 起 作用 的 是 为 安全 组件 发送 _ Token :

{message: "'_Token' was not found in request data.", url: "/.../add.json", code: 400,…}

格式
当然 , 我 可以 禁用 SecurityComponent 。
我 的 请求 不 需要 表单/表单 助手 , 那么 问题 是 , 当 我 不 使用 传统 的 基于 表单 的 应用 程序 时 , 在 这里 使用 SecurityComponent 是否 有 意义 。 当然 , 我 希望 在 某些 操作 中 使用 某些 post 字段/值 是 有 意义 的 , 但 我 不 确定 如何 将 其 与 SecurityComponent 结合 使用 。
我 想 我 可以 用 helper 创建 一 个 虚拟 表单 , 并 从中 提取 令牌 , 但 这 只 生成 一 次 , 而且 我 有 一 个 SPA 。
这 当然 行得通 :
过滤 器 之前 :x1月 1 日

gt0wga4j

gt0wga4j1#

我 只是 提供 一 个 技术 性 的 答案 , 而 不是 对 使用 SecurityComponent 是否 有 意义 发表 意见 - 安全 性 不是 我 的 强项 。
如果 您 需要 从 SPA 提交 许多 AJAX 调用 , 您 是否 可以 通过 AJAX 请求 生成 请求 表单 , 然后 从中 提取 令牌 ? 这 听 起来 可能 有点 笨拙 , 但 实际 上 可以 非常 简洁 地 完成 - 您 提交 的 每个 AJAX 请求 都 可以 完成 您 需要 它 做 的 事情 。然后 返回 一 个 新 的 <form> 元素 ( 带有 新 的 令牌 ) 作为 其 响应 的 一 部分 - 然后 可以 将 其 隐藏 在 不可 见 的 地方 , 覆盖 前 一 个 元素 , 并 从 中 检索 令牌 以 用于 下 一 次 调用 。
当 涉及 到 管理 提交 时 , 我 发现 处理 token 等 的 最 简单 的 方法 是 将 this answer 与 序列 化 结合 起来 ( 例如 jQuery 的 serialize() ) 。 这 将 把 所有 隐藏 的 表单 值 整齐 地 打包 起来 。 我 的 ( 基于 jQuery 的 ) 代码 如下 所 示 :

var ele_form = $('#some-form-id');
var ele_csrf = ele_form.find('input[name="_csrfToken"]');
var target_url = ele_form.attr('action'); // form-action is validated, so need to generate this correctly
var csrf_token = ele_csrf.val();
$.ajax({
    type: 'POST',
    url: target_url,
    beforeSend: function(xhr){
        xhr.setRequestHeader('X-CSRF-Token', csrf_token);
    },
    data: ele_form.serialize()
});

中 的 每 一 个
如果 您 想 更 具体 地 了解 在 SPA 中 发送 的 请求 类型 , 那么 很 乐意 详细 介绍 该 示例 。

相关问题