Проверка, должен ли пользователь иметь доступ к записи в CakePHP - PullRequest
0 голосов
/ 26 мая 2011

Мне просто интересно, есть ли быстрый / эффективный способ сделать это в Cake, а не писать саму логику кода (хотя это не будет сложно, это может быть немного нечисто).

Предположим, у вас есть нормальная таблица users, а затем таблица posts. Каждый пользователь может иметь много сообщений и ссылки user_id in posts на id in 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 без выполнения проверки if, а затем перенаправления. Я действительно хочу «связать» / «ограничить» страницу так, чтобы $id, переданный edit(), был таким, что они создали книгу (или, по крайней мере, являются текущим «владельцем») в posts таблица.

Если говорить более кратко, мой вопрос: какова версия торта:

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

(псевдокод, но я надеюсь, что это дает идею). Я просмотрел документацию, но, похоже, не вижу этого (для меня было бы просто «иметь смысл», что он существует, учитывая, насколько удивительны остальные библиотеки в том, что они делают для вас с минимальной работой).

1 Ответ

0 голосов
/ 26 мая 2011

Не совсем, нет. Вам всегда придется явно проверять доступ на уровне записей, так как они намного более свободны, чем, скажем, разрешения метода контроллера 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;
    }
}
...