验证用户是否应该能够访问CakePHP中的记录

时间:2011-05-26 01:47:31

标签: php cakephp-1.3

我只是想知道在Cake中是否有一种快速/有效的方法来执行此操作而不是自己编写代码逻辑(虽然这并不困难,但可能只是有点不干净)。

假设您有一个普通的users表,然后是一个posts表。每个用户都可以有多个帖子,user_id postsid链接到users中的function edit($id = null) { $this->Post->id = $id; if (empty($this->data)) { $this->data = $this->Post->read(); } else { if ($this->Post->save($this->data)) { $this->Session->setFlash('Your post has been updated.'); $this->redirect(array('action' => 'index')); } } }

教程显示如何编辑记录:

user.id

有效地检查post.user_id = $id而不进行if检查,然后重定向的最佳方法是什么?我实际上想要“绑定”/“限制”页面,以便传递给edit()的{​​{1}}就是这样,他们创建了这本书(或者,至少是当前的'所有者') posts表。

更简洁的是,我的问题是:什么是蛋糕版:

$this->Post->read();
if ($this->Post->data['Post']['user_id'] != $my_current_user_id){
    // Redirect
}

(伪代码,但我希望它能提出这个想法)。我已经浏览了文档,但我似乎无法看到这一点(对我而言,它只是'有意义'它存在,因为其余的库在他们用最少的工作为你做的事情是多么棒。)< / p>

1 个答案:

答案 0 :(得分:0)

不是,不。您将始终必须明确地进行记录级访问检查,因为它们比Auth控制器方法权限更自由。即使使用非常自动化的ACL,您至少需要调用ACL访问检查。我经常这样做:

public function edit($id) {
    $post = $this->Post->find('first', array('conditions' => array('Post.user_id' => $this->Auth->user('id'), 'Post.id' => $id));
    if (!$post) {
        $this->cakeError('error403');
    }

    if ($this->data) {
        ...
    } else {
        $this->data = $post;
    }
}