Cakephp 3.6.14: перенаправление после действия запретить - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь deny выполнить некоторые действия для пользователей без прав администратора в моих контроллерах.Таким образом, в контроллерах я использую этот код:

public $components = array('Auth');

public function beforeFilter(Event $event) {
    parent::beforeFilter($event);
    if($this->Auth->user('role_id')==1 or $this->Auth->user('role_id')==2){ //role: 1 admin, 2 project manager
        $this->set('is_admin', true);
    }
    else
    {            
        $this->Auth->deny(['index','delete']);
        $this->set('is_admin', false);            
    }        

    $this->set('my_id', $this->Auth->user('id'));
}

Так что теперь каждый раз, когда пользователь, не являющийся администратором или менеджером проекта, пытается выполнить действия index или delete, перенаправляется на «Метод неРазрешено "ошибка страницы.Но я хотел бы вернуться на предыдущую страницу с сообщением: «Вы не авторизованы для выполнения этого действия».

Я попытался установить 'unauthorizedRedirect' => $this->referer() в контроллере приложений:

  $this->loadComponent('Auth', [
            'authenticate' => [
                'Form' => [
                    'fields' => [
                        'username' => 'email',
                        'password' => 'password'
                    ]
                ]
            ],
            'loginAction' => [
                'controller' => 'Users',
                'action' => 'login'
            ],
            'unauthorizedRedirect' => $this->referer()
        ]); 

Но не сработало.Единственный способ добиться этого - использовать этот код в функции beforeFilter контроллера:

 if(!($this->Auth->user('role_id')==1 && !$this->Auth->user('role_id')==2 && ($this->request->action === 'index' || $this->request->action === 'delete')){
        $this->Flash->error(__('You are not authorized to perform this action'));
        return $this->redirect(['controller' => 'Users', 'action' => 'index']);
    }

Но, похоже, это неправильный способ сделать это во всех контроллерах, которые яхочу отрицать некоторые действия.Есть ли другой способ?

1 Ответ

0 голосов
/ 30 января 2019

Cakephp обеспечивает функцию isAuthorized для того же.Вы можете воспользоваться этим.Просто определите isAuthorized в вашем контроллере приложения или в отдельных контроллерах (если вы хотите поставить отдельные условия для каждого контроллера.)

 public function isAuthorized($user)
    {
        $roleArray = [1, 2]; // your role ids array
        if ( !in_array($user['role_id'], $roleArray) && in_array($this->request->getParam('action'), ['index', 'delete'])) {  // put your conditions here
           return false;
        }
      return true;
    }

Cakephp -> Аутентификация и авторизация -> Авторизация (кому разрешен доступчто)

...