【问题标题】:Cakephp 3 - CRUD plugin - Use id from auth componentCakephp 3 - CRUD 插件 - 使用身份验证组件中的 id
【发布时间】:2016-08-25 13:54:36
【问题描述】:

目前,我正在使用 Cakephp 3 的 CRUD v4 插件。对于我的用户控制器中的编辑功能,重要的是只有用户本身才能更改他或她的凭据。我想通过从身份验证组件中插入用户 ID 来实现这一点。以下控制器方法:

public function edit($id = null){
    $this->Crud->on('beforeSave', function(\Cake\Event\Event $event) {
        $event->subject()->entity->id = $this->Auth->user('id');
    });
    return $this->Crud->execute();
}

如何确保不需要通过 url 提供 id?标准实现需要这样的 url:http://domain.com/api/users/edit/1.json 通过 PUT 请求。我想要做的是用户只需填写 http://domain.com/api/users/edit.json 并发送一个 JSON 正文。

我已经尝试了几件事:

  • $id = null 给定参数时,如上例所示。如果在 url 中不提供任何 id,这将引发 404 错误,这是由 FindMethodTrait.php 中的 _notFound 方法引起的
  • 使用 beforeFind 而不是 beforeSave。这也不起作用,因为这不是编辑功能的合适方法。
  • 只提供一个数据库中不存在的随机 ID。这将通过 404 错误。我认为这是最重要的迹象(与第 1 点相结合)表明有问题。由于我尝试覆盖此值,因此 CRUD 插件不允许我以完全忽略插入值的方式执行此操作(覆盖 $event->subject()->entity->id)。李>
  • 尝试通过http://domain.com/api/users.json 使用PUT 访问方法。这将尝试将操作路由到 index 方法。
  • 只需检查几项:我的 AppController 中使用了 controllerTrait,并且没有禁用 crud 编辑功能。

有谁知道我在这里做错了什么?这是一个错误吗?

【问题讨论】:

  • 你设置了什么样的授权?
  • 如果您在 auth 组件中使用控制器授权,那么您应该检查用户是否与 url id 匹配?您是否有理由要从 url 中删除 id?
  • @chrisShick 我正在使用 JWT 有效负载的无状态身份验证。我想从 url 中删除 id 的原因是,应该从身份验证组件中检索用户 id。通过这种方式,我想强制用户只能更改他或她的凭据,而不是所有人。

标签: cakephp cakephp-3.0 crud


【解决方案1】:

我个人会使用 Auth 组件中的控制器授权来防止任何人更新其他人的信息。这样您就不必更改 crud 代码。像这样的……

将此行添加到 Auth 组件的配置(可能在您的 AppController 中):

'authorize' => ['Controller']

然后,在应用控制器内部创建一个名为 isAuthorized 的函数:

public function isAuthorized($user) {
    return true;
}

然后,在您的 UsersController 中,您可以覆盖 isAuthorized 函数:

public function isAuthorized($user) {
   // The owner of an article can edit and delete it
   if (in_array($this->request->action, ['edit'])) {
      $userId = (int)$this->request->params['pass'][0];
      if ($user['id'] !== $userId) {
         return false;
      }
    }
   return parent::isAuthorized($user);
}

【讨论】:

  • 这其实很聪明。目前,我在动作本身中执行每条规则,这需要我扩展几乎每一个粗略的动作。感谢您的洞察力;)。
  • 请记住始终认为 DRY(不要重复自己)。 CakePHP 是围绕一个这样的原则构建的,并且通常总是有一种方法可以帮助您不要重复自己;)
猜你喜欢
  • 2020-03-27
  • 2014-04-26
  • 2013-11-10
  • 2018-06-02
  • 2015-12-03
  • 2018-09-07
  • 2016-08-24
  • 2015-07-12
  • 1970-01-01
相关资源
最近更新 更多