,

Настройка доступа в Yii2 через фильтр AccessControl


В Yii2 управление доступом на уровне контроллера настраивается через фильтр AccessControl , который подключается на уровне контроллера через поведение — метод behaviors :

use yii\filters\AccessControl;

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['login', 'logout', 'signup'],
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['login', 'signup'],
                        'roles' => ['?'],
                    ],
                    [
                        'allow' => true,
                        'actions' => ['logout'],
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }
    // ...
}Code language: PHP (php)

Этот фильтр перехватывает входящие запросы и проверяет, имеет ли текущий пользователь право выполнять запрошенное действие (экшен) еще до того, как код самого экшена начнет исполняться. С помощью свойства only задается список конкретных действий, к которым применяется данный фильтр, в то время как все остальные методы контроллера, не указанные в этом списке, остаются доступными для всех по умолчанию.

Вся логика разграничения прав описывается в массиве rules, где правила проверяются последовательно сверху вниз до первого совпадения. Каждое правило определяет, разрешить ('allow' => true) или запретить доступ к указанным экшенам (actions) для определенных категорий пользователей (roles). Для простой проверки Yii2 использует встроенные псевдонимы ролей: ? обозначает гостей (неавторизованных пользователей), а @ — вошедших в систему (авторизованных) пользователей.

В нашем примере кода доступ к экшенам login и signup разрешен только для гостей (?), что логично, ведь авторизованному пользователю регистрироваться или входить заново не нужно. Доступ к logout, напротив, открыт исключительно для авторизованных пользователей (@). Если запрос пользователя не подошел ни под одно из условий (например, авторизованный пользователь пытается зайти на login), AccessControl автоматически заблокирует доступ: отправит гостя на страницу авторизации, а авторизованному пользователю вернет ошибку 403 (Forbidden).