Как разрешить неаутентифицированным пользователям видеть определенные страницы или страницы действий в Cake PHP 3?

В CakePHP 3 мы использовали компонент Auth, и это работало так же, как CakePHP - Как разрешить неаутентифицированный доступ к определенным страницам

Теперь я пытаюсь использовать вместо этого новые плагины аутентификации и авторизации (не знаю, лучшее ли это решение).

У меня такой случай:

У меня есть несколько таблиц в базе данных для сущностей (автомобилей, марок и пользователей). У меня есть пользователи и 4 уровня пользовательских ролей (пирамида).- Администраторы могут изменять все - Редакторы могут видеть и добавлять марки и автомобили, но только могут редактировать или обновлять автомобили и марки, созданные ими самими.- Зарегистрированные пользователи могут добавлять только автомобили и редактировать свои автомобили (и видеть все автомобили и марки).- Анонимные пользователи могут видеть все, но могут только создать учетную запись пользователя.

Аутентификация работает сама по себе. Чтобы разрешить анонимный доступ пользователей к контенту, я использую$this->Authentication->allowUnauthenticated(['login', 'add']); но когда я загружаю плагин авторизации, все выдает ошибку.

Нужно ли мне указывать весь доступ к авторизации с помощью authorizeModel и других функций? Есть ли способ авторизоваться одновременно с обоими плагинами? Мне действительно нужен для этого плагин авторизации и он рекомендуется, или плагин аутентификации может с этим справиться?

В предыдущем компоненте Auth я работал с чем-то вроде этого фрагмента кода:

В AppController.php

public function beforeFilter(Event $event)
{
    $this->Auth->allow(['view', 'display']);
}

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

В UsersController.php

public function beforeFilter(Event $event)
{
    parent::beforeFilter($event);
    $this->Auth->allow('add', 'logout');
}

В контроллерах автомобилей и торговых марок

public function isAuthorized($user)
{
    if (isset($authUser['role']) && $authUser['role'] === 'admin') {
        return true;
    }

    if ($this->request->action === 'add') {
        return true;
    }

    if ($this->request->action === 'index') {
        return true;
    }

    if (in_array($this->request->action, ['edit'])) {
        $carId = (int)$this->request->params['pass'][0];
        if ($this->Cars->exists(['id' => $carId, 'user_id' => $authUser['id']])) {
            return true;
        }
    }

    return false;
}

Далее следует из https://book.cakephp.org/3/es/tutorials-and-examples/blog-auth-example/auth.html

Мои версии: - CakePHP 3.8 - Плагин аутентификации 1.4 - Плагин авторизации 1.3

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

Изменить: если я выйду из unauthenticatedRedirect, я получаю:

No identity found. You can skip this check by configuring `requireIdentity` to be `false`.
Authentication\Authenticator\UnauthenticatedException

Если я добавлю requireItentity как false, в AppController

        $this->loadComponent('Authentication.Authentication', [
            'requireIdentity' => false
        ]);

Получаю (где / путь, можно / cars / бренды)

The request to `/` did not apply any authorization checks.
Authorization\Exception\AuthorizationRequiredException

Если я использую это в AppController (всегда аутентификация перед авторизацией)

        $this->loadComponent('Authentication.Authentication', [
            'requireIdentity' => false
        ]);
        $this->loadComponent('Authorization.Authorization', [
            'skipAuthorization' => [
                'login',
            ]
        ]);

и это в приложении

        $service->setConfig([
            'unauthenticatedRedirect' => \Cake\Routing\Router::url('/users/login'),
            'queryParam' => 'redirect',
        ]);

Я отправляю всех пользователей на страницу входа, но появляется ошибка проверки авторизации. С$this->Authorization->skipAuthorization(); в beforeFilter() пользователь может видеть страницы и работать, но я не знаю, подходит ли это.

Если я использую это в любом контроллере beforeFilter $this->Authorization->authorizeModel('index', 'add', 'display' ...);

я получил

Policy for `App\Model\Table\CarsTable` has not been defined.
Authorization\Policy\Exception\MissingPolicyException

На домашней странице (или в контроллере страниц) я получаю

Policy for `Cake\ORM\Table` has not been defined.
Authorization\Policy\Exception\MissingPolicyException

Мне действительно нужно создавать политики для каждой таблицы? Я думаю, что это более сложный, чем предыдущий компонент Auth, или, может быть, я что-то делаю не так.

0 ответов

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