В 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).
