CakePHP 3.8.6: Ошибка авторизации при добавлении нового контента

Учитывая, что я новичок в CakePHP, я не мог не заметить явный сбой в авторизации. Опять же, продолжая обучение по CMS, когда я добавил код для авторизации и вошел как user1 на страницу статей / добавления, все было в порядке. Затем я выбрал пользователя из раскрывающегося списка (после запускаcake bake all articlesкоманда и повторное изменение ArticlesController.php в соответствии с руководством и без изменения файлов '.ctp) с идентификатором пользователя = 2, создал статью и также смог ее сохранить, хотя я вошел в систему как пользователь1 с идентификатором пользователя = 1!! Мне это тоже показалось странным... Затем я попытался отредактировать статьи пользователя user2, он правильно выдал "Ошибка несанкционированного доступа", но когда я попытался отредактировать собственные статьи пользователя user1, он выдал следующую ошибку:

Notice (8): Trying to get property 'user_id' of non-object [APP/Controller\ArticlesController.php, line 154]

Warning (512): Unable to emit headers. Headers sent in file=D:\dev\cakePHP\projects\cake_cms\vendor\cakephp\cakephp\src\Error\Debugger.php line=856 [CORE\src\Http\ResponseEmitter.php, line 51]

Warning (2): Cannot modify header information - headers already sent by (output started at D:\dev\cakePHP\projects\cake_cms\vendor\cakephp\cakephp\src\Error\Debugger.php:856) [CORE\src\Http\ResponseEmitter.php, line 152]

Warning (2): Cannot modify header information - headers already sent by (output started at D:\dev\cakePHP\projects\cake_cms\vendor\cakephp\cakephp\src\Error\Debugger.php:856) [CORE\src\Http\ResponseEmitter.php, line 181]

Warning (2): Cannot modify header information - headers already sent by (output started at D:\dev\cakePHP\projects\cake_cms\vendor\cakephp\cakephp\src\Error\Debugger.php:856) [CORE\src\Http\ResponseEmitter.php, line 181]

Warning (2): Cannot modify header information - headers already sent by (output started at D:\dev\cakePHP\projects\cake_cms\vendor\cakephp\cakephp\src\Error\Debugger.php:856) [CORE\src\Http\ResponseEmitter.php, line 181]

Код, соответствующий сообщению об ошибке (ArticlesController.php, строка 154), выглядит следующим образом:

public function isAuthorized($user)
{
    $action = $this->request->getParam('action');
    // The add and tags actions are always allowed to logged in users.
    if (in_array($action, ['add', 'tags'])) {
        return true;
    }

    // All other actions require a slug.
    $slug = $this->request->getParam('pass.0');
    if (!$slug) {
        return false;
    }

    // Check that the article belongs to the current user.
    $article = $this->Articles->findBySlug($slug)->first();

<**line 154**>    return $article->user_id === $user['id'];
}

Это означает, что функция редактирования не работает независимо от того, какой пользователь вошел в систему.

So here is my question: 
  1. Как работает авторизация, когда один пользователь, скажем, user1, пытается сохранить статью с идентификатором пользователя, отличным от него самого?
  2. Почему код авторизации не позволяет пользователю user1 редактировать свою статью?

Заранее спасибо, Swroop

1 ответ

Сообщение об ошибке (строка 154) указывает, что $article никогда не получил правильного значения, которое предполагалось, что означает, что $slugникогда не получал правильного значения, хотя и ненулевого значения. Я нашел проблему. Оказывается, я использую find by Id (автоматическая генерация кода), а неfindBySlug() в edit() код, как предложено в статье, поэтому вызов функции $slug = $this->request->getParam('pass.0'); возвращает идентификатор статьи, а не $slugзначение. Если человек используетbin\cake bake all articles команда для автогенерации большей части кода, она идет с поиском по идентификатору, а не findBySlug(). Следовательно, код авторизации должен выглядеть следующим образом:

    public function isAuthorized($user)
    {
        $action = $this->request->getParam('action');
        // The add and tags actions are always allowed to logged in users.
        if (in_array($action, ['add', 'tags'])) {
            return true;
        }

        // All other actions require a slug.
        $id = $this->request->getParam('pass.0');
        if (!$id) {
            return false;
        }

        // Check that the article belongs to the current user.
        $article = $this->Articles->get($id);

        return $article->user_id === $user['id'];
    }

С указанным выше изменением только Авторизованный пользователь может редактировать, что не позволяет другим пользователям.

Это отвечает только на второй вопрос, первый вопрос остается открытым.

Другие вопросы по тегам