От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком Yii2. В этой статье мы с вами продолжим работать с фильтром контроля доступа – Yii2 Access Control Filter (ACF). В частности, мы рассмотрим некоторые другие его свойства.
Из прошлой статьи мы узнали, как можно достаточно гибко ограничивать доступ к конкретным контроллерам или даже конкретным действиям этих контроллеров. В этой статье мы пойдем чуть дальше и попробуем добавить некоторые условия, согласно которым мы будем разрешать или запрещать доступ.
Для начала познакомимся со свойством matchCallback. Данное свойство принимаем параметром колбек функцию и, в зависимости от того, что вернет функция, доступ будет разрешен или запрещен. Если функция вернет true – доступ разрешен, false – запрещен. Проверим. Давайте откроем доступ для авторизованных пользователей к контроллеру Default (и ко всем прочим контроллерам, если таковые у вас есть). Ну а к контроллеру Test откроем доступ для всех:
1 2 3 4 5 6 7 8 9 10 11 12 |
'rules' => [ [ 'allow' => true, 'controllers' => ['admin/test'], ], [ 'controllers' => ['admin/default'], 'allow' => true, 'roles' => ['@'], ], ], |
Теперь неавторизованные пользователи имеют доступ ко всем действиям контроллера Test. Допишем callback-функцию, которая для начала просто вернет false:
1 2 3 4 5 6 7 |
[ 'allow' => true, 'controllers' => ['admin/test'], 'matchCallback' => function($rule, $action){ return false; } ], |
После этого доступ к контроллеру будет закрыт даже для авторизованных пользователей.
Соответственно, если функция вернет true – доступ будет предоставлен. Этим и можно воспользоваться, организуя всевозможные проверки. Возьмем пример из документации и откроем доступ, если сегодня определенная дата:
1 2 3 4 5 6 7 |
[ 'allow' => true, 'controllers' => ['admin/test'], 'matchCallback' => function($rule, $action){ return date('d-m') === '23-06'; } ], |
Если сегодня 23 июня, тогда текущий вызов функции date() вернет true и параметр matchCallback также получит true – доступ будет открыт. Мы можем организовать и более полезные проверки. Например, можем реализовать простейшую систему ролей: гость, пользователь, администратор. В данном параметре нам будет достаточно проверить роль авторизованного пользователя и, если это не admin – вернуть false.
Еще одной полезной возможностью будет ограничение доступа по IP, для этого мы можем обратиться к параметру ips. Давайте откроем доступ ко всей админке только для локального IP:
1 2 3 4 5 |
[ 'allow' => true, 'roles' => ['@'], 'ips' => ['127.0.0.1'], ], |
После этого доступ будет открыт только для указанного адреса IP, все прочие увидят уже знакомую картину:
Таким образом, возможностей Access Control Filter вполне будет достаточно для организации простой системы ролей на сайте. А на сегодня все. Больше о фреймворке вы можете узнать из наших бесплатных или платных уроков. Также создание простейшего блога на Yii2 можно посмотреть в этом цикле уроков.