Intereting Posts
Вирус / вредоносная программа, модифицирующая .htaccess на веб-сайте Joomla CMS Как установить php-cgi в качестве плагина в Mac OS (OS X 10.10)? База данных связанных параметров PHP вызывает неправильное количество параметров, если я использую двоеточие плагин wordpress, доступ к $ wpdb на не видимой странице Невозможно получить значения из массива JSON и объекта передать параметры php с оболочкой php imap получить с адреса электронной почты Как добавить фильтр электронной почты в учетную запись электронной почты IMAP? Ошибка при использовании PHP cURL с сертификатами SSL Вызов неопределенного метода Illuminate \ Database \ Schema \ MySqlBuilder :: defaultStringLength () Как отображать обычную цену и цену продажи на страницах одного продукта и цикла? Weird поведение var_dump Отправлять Push-уведомление в APNS через прокси-сервер Laravel Eloquent :: Find () возвращает NULL с существующим идентификатором Как извлечь название сайта?

Авторизовать пользователей на основе ролей в CakePHP 3

Я хотел бы авторизовать пользователей на основе нескольких ролей. Все посетители должны иметь возможность дойти до показа метода. Поэтому я написал в 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; } 

(очевидно, этот код можно сократить по своему вкусу, но он показывает концепцию)