При разработке сайтов часто встречается задача по ограничению доступа части пользователей в доступе к различным страницам и целым модулям сайта, например, к личному кабинету пользователя. Для решения этой задачи в Yii2 имеются фильтры контроля доступа (ACF) — простой и гибкий механизм, который крепится к контроллерам и модулям в виде поведения.

Код выше блокирует доступ к странице «test/secret» для всех пользователей не прошедших аутентификацию.

Код выше блокирует доступ ко всему модулю для всех пользователей не прошедших аутентификацию.

Аутентификация — процесс проверки подлинности пользователя. Обычно осуществляется путем поиска в базе данных пары логина и хеша пароля. Документация по аутентификации в Yii2. Пользователи прошедшие аутентификацию обозначаются символом ‘@‘, а не прошедшие (гости) обозначаются символом ‘?‘.

Авторизация — процесс проверки прав доступа пользователей к какому-либо функционалу или модулю. Документация по авторизации в Yii2. Если гость (?) попадает на страницу с доступом только для аутентифицированных (@) пользователей, то его автоматически перебросит (редирект) на страницу аутентификации (форму входа).

Класс AccessControl позволяет задавать следующие параметры:

  • only — массив идентификаторов действий (action’ов) контроллера, к которым будут применяться правила. Если этот параметр не задан, то правила будут применяться ко всем действиям контроллера.
  • denyCallback — функцию обратного вызова (callback) при запрете доступа по одному из правил из массива rules. Эта функция при необходимости может принимать два параметра: $rule и $action.
  • ruleConfig — массив с правилами по умолчанию, можно сказать, что это общие настройки для всех правил из массива rules. Правила доступа из этого массива сливаются с массивом rules и ставятся в начало списка.
  • rules — массив с правилами доступа к действиям (action’ам). Каждое правило доступа можно назвать объектом (оно в него преобразуется) класса AccessRule, который имеет несколько свойств (публичных полей). Настраивая и комбинируя эти поля можно построить гибкую систему доступа, вот их список:
    • allow — тип правила, true — разрешение, false — запрет.
    • actions — массив идентификаторов действий (action’ов).
    • controllers — массив идентификаторов контроллеров. Обычно применяется при конфигурации модулей. Если свойство не указано, то оно действует на все контроллеры.
    • roles — роли пользователя.
    • ips — массив IP-адресов.
    • verbs — HTTP метод (GET, POST, OPTIONS, HEAD, PUT, DELETE, TRACE, CONNECT или PATCH).
    • matchCallback — это функция обратного вызова (callback), которая определяет будет ли применяться правило или нет. Он должна вернуть true (правило сработает) или false (правило проигнорируется).
    • denyCallback — это функция обратного вызова (callback), которая будет вызвана при запрете доступа из текущего правила. Обычно генерируют исключение, переадресуют пользователя на другую страницу или завершают работу скрипта как в примере ниже.

Через комбинирование свойств классов AccessControl и AccessRule можно выстроить практически любую логику доступа к модулям, контроллерам и их действиям. Для наглядности добавлю еще один пример:

Yii2 из коробки предоставляет еще один способ авторизации — на основе ролей (RBAC — role based access control), который является более гибким механизмом, но эта гибкость может привести к излишней сложности кода. Для большинства проектов достаточно использования ACF, даже если в системе присутствуют несколько ролей. Контролировать и совмещать доступ нескольких пользователей с разными ролями можно через matchCallback, например:

Полезные ссылки по работе с ACF:

Добавить комментарий