Cakephp 3 - CRUD插件 - 使用auth组件中的id

时间:2016-04-30 12:02:52

标签: cakephp cakephp-3.0 crud

目前,我正在使用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();
}

如何确保我不需要通过网址提供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访问该方法。这将尝试将操作路由到索引方法。
  • 只需几个检查:我的AppController中使用了controllerTrait,并且未禁用crud编辑功能。

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

1 个答案:

答案 0 :(得分:2)

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

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

$(MAKECMDGOALS): $(MAKECMDGOALS).src1 $(MAKECMDGOALS).src2
    $(MYCOMMANDS) $(MAKECMDGOALS).scr1 $(MAKECMDGOALS).scr2 

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

'authorize' => ['Controller']

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

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