Cakephp 3.0 isAuthorized() не вызывается

Я следил за учебным пособием и всем руководством по авторизации CakePHP, и я не могу вызвать мой метод isAuthorized(). Мое понимание (поправьте меня, если я ошибаюсь, что невероятно вероятно) заключается в делегировании авторизации конкретным контроллерам путем выполнения 'authorize'->['Controller'] в AppController.php, когда вызывается метод в UsersController, в этом случае «добавить», UsersController запускает метод isAuthorized() Я определил. Я проверял, работает ли этот метод вообще, выводя сообщение об ошибке flash-> прямо при вызове isAuthorized(), но ничего не происходит. Если я явно вызову isAuthorized($hardcodeduser) в моем методе beforeFilter(), он будет работать, но только если я жестко запрограммирую пользователя.

Предполагается, что этот метод работает следующим образом: если зарегистрированный пользователь запрашивает добавление/создание нового пользователя, система проверяет, есть ли у пользователя разрешения уровня администратора/сотрудника (это просто значение 0 или 1 в базе данных) и если у пользователя нет разрешения, он перенаправляется на главный экран с сообщением об ошибке, в котором говорится: «У вас нет прав для доступа к этой функции».

Будем очень признательны за любую помощь, предложения или другие ссылки!

class AppController extends Controller {

    public $components = ['Flash', 'Auth', 'Session'];

    public function initialize() {

        $this->loadComponent('Flash');
        $this->loadComponent('Auth', [
            'authorize' => ['Controller'],
            'loginRedirect' => [
                'controller' => 'Articles',
                'action' => 'index'
            ],
            'logoutRedirect' => [
                'controller' => 'Pages',
                'action' => 'display',
                'home'
            ]

        ]);
    }

    public function beforeFilter(Event $event) {
        $this->Auth->authorize = 'Controller';
    }

    public function isAuthorized($user) {

        if(isset($user['is_staff']))
            return true;

        return false;
    }
}


class UsersController extends AppController {

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

    public function isAuthorized($user) {

        $this->Flash->error(__('Test Message PLEASE WORK'));
        if($this->request->action === 'add') {
            $isStaff = $user['is_staff'];
            if($isStaff == 0) {
                $this->redirect($this->Auth->redirectUrl());
                $this->Flash->error(__('Not authorized to access this function'));  
                return false;
            }
        }
        return parent ::isAuthorized($user);
    }
}

person vars91    schedule 01.12.2014    source источник
comment
В вашем коде есть еще несколько недостатков кодирования. Один из них: что вы забыли вернуть свои редиректы, и что любой последующий код вообще не выполняется. И вам действительно нужно разобраться с основами, как упоминал ndm.   -  person mark    schedule 01.12.2014
comment
Я извиняюсь за формат, я никогда раньше не публиковал в стеке и сделал плохую и поспешную работу по копированию кода. Интервал для создания блоков кода сбил меня с толку, и я не осознавал, что он так плохо отображается. Не будучи вызванным, я имею в виду: когда вызывается функция добавления UsersController, у меня сложилось впечатление, что isAuthorized() будет вызываться автоматически из-за вызова 'authroize'=>'Controller' в контроллере приложения. Я ожидал, что мое тестовое сообщение появится, потому что я полагал, что isAuthorized будет вызван, но ничего не появится, если я явно не вызову isAuthroized($user) в перед фильтром   -  person vars91    schedule 02.12.2014


Ответы (3)


Как правило, ваше предположение верно, Controller::isAuthorized() будет вызываться автоматически при использовании обработчика авторизации контроллера.

Проблема с вашим кодом заключается в том, что в вашем методе UsersController::beforeFilter() вы явно разрешаете доступ к методу add всем (он даже не требует аутентификации):

$this->Auth->allow(['logout', 'add']);

Вы должны понимать, что после того, как метод будет разрешен, компонент аутентификации больше не будет проводить никаких проверок, см. /AuthComponent.php#L265-L267" rel="noreferrer">AuthComponent::startup().

Также обратите внимание, что вам не нужно перенаправлять и устанавливать флэш-сообщение вручную, компонент сделает это за вас, вам просто нужно настроить его соответствующим образом, используя параметры authError и unauthorizedRedirect, см. Поваренная книга > Компоненты > Аутентификация > Параметры конфигурации

person ndm    schedule 02.12.2014
comment
Спасибо за ссылку на AuthComponent::startup(), многое прояснилось. Я еще не изменил параметры конфигурации Auth (нашел их при поиске решения моей вышеуказанной проблемы), но на данный момент у меня просто есть флэш-сообщение, чтобы убедиться, что isAuthorized вызывается. Я изменил Auth-›allow и удалил добавление, но проблема все еще остается. Я не знаю, что именно мне не хватает, или я каким-то образом переопределяю метод isAuthorized(), или, может быть, мой beforeFilter() в любом контроллере необходимо изменить. - person vars91; 03.12.2014
comment
Большое спасибо за этот ответ! Я чуть не рвал на себе волосы, потому что isAuthorized не вызывался, и оказалось, что я просто не понимал, как это на самом деле работает. - person Gus; 06.01.2016

Когда мы следили за учебником блога Cake, они сделали небольшую ошибку, что функция «isAuthorized» никогда не вызывается. И я потратил время на его изучение. Решение: добавление этой строки при загрузке компонента «Аутентификация»:

'authorize' => array('Controller'),

поэтому код должен выглядеть примерно так:

$this->loadComponent('Auth', [
    'loginRedirect' => [
        'controller' => 'Articles',
        'action' => 'index'
    ],
    'logoutRedirect' => [
        'controller' => 'Pages',
        'action' => 'display',
        'home'
    ],
    'authorize' => array('Controller'),                
]);

Надеюсь, это поможет кому-то сэкономить время :)

person Robin Nguyen    schedule 16.04.2015
comment
Они отметили это в учебниках немного ниже, но я тоже пропустил это, и это помогло - person Andre Sugai; 18.06.2015

Из документации cakephp 3.x: вы можете настроить обработчики авторизации в методах beforeFilter() или initialize() вашего контроллера, используя массив:

// Basic setup
$this->Auth->config('authorize', ['Controller']);

// Pass settings in
$this->Auth->config('authorize', [
'Actions' => ['actionPath' => 'controllers/'],
'Controller'
]);
person Br.sasa    schedule 08.02.2016