Я хотел бы авторизовать пользователей на основе нескольких ролей. Все посетители должны иметь возможность дойти до показа метода. Поэтому я написал в AppController:
public function beforeFilter(Event $event) { $this->Auth->allow(['show']); }
Оно работает.
В методе initialize () AppController у меня есть также:
$this->loadComponent('Auth', [ 'authorize' => 'Controller' ]);
Я хотел бы разрешить зарегистрированным пользователям с ролью «пользователь» достичь всех «индексов» и «добавить» методы, поэтому я написал в AppController:
public function isAuthorized($user) { if (isset($user['role']) && $user['role'] === 'admin') { return true; } if (isset($user['role']) && $user['role'] === 'user') { $this->Auth->allow(['index', 'logout', 'add']); } return false; }
Администратор может достигать всех методов, как ожидалось. Пользователь, зарегистрированный с ролью «пользователь», не может достичь метода «индекс» или «добавить». Как я могу это исправить?
Вместо того, чтобы использовать вашу логику для добавления дополнительных возможностей Auth, просто используйте логику, чтобы определить, находятся ли они в действии, которое им разрешено, проверив действие и вернув true
если они авторизованы.
public function isAuthorized($user) { // Admin allowed anywhere if (isset($user['role']) && $user['role'] === 'admin') { return true; } // 'user' allowed in specific actions if (isset($user['role']) && $user['role'] === 'user') { $allowedActions = ['index', 'logout', 'add']; if(in_array($this->request->action, $allowedActions)) { return true; } } return false; }
(очевидно, этот код можно сократить по своему вкусу, но он показывает концепцию)