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:
- Как работает авторизация, когда один пользователь, скажем, user1, пытается сохранить статью с идентификатором пользователя, отличным от него самого?
- Почему код авторизации не позволяет пользователю 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'];
}
С указанным выше изменением только Авторизованный пользователь может редактировать, что не позволяет другим пользователям.
Это отвечает только на второй вопрос, первый вопрос остается открытым.