Есть такие сайты на которых необходимо чтобы каждый посетитель сначала авторизовался, прежде чем увидеть содержимое сайта. К таким проектам в основном относятся системы администрирования, хотя и не только. Поиски в интернете не дали никаких вменяемых ответов как реализовать такой механизм на Yii, так что пришлось разбираться самому.
Как оказалось сделать подобную конструкцию довольно просто. Для этого в контроллере необходимо переопределить метод beforeAction, например так:
class Controller extends CController
{
// ...
protected function beforeAction($action)
{
if (Yii::app()->user->isGuest AND $this->id . '/' . $action->id !== 'account/login') {
Yii::app()->user->loginRequired();
}
return true;
}
// ...
}
После этого все контроллеры, к которым надо закрыть доступ, наследовать от этого контроллера вместо CController. Если проект создавался через yiic webapp, то такой контроллер можно найти в /protected/components/Controller.php. Таким образом все не авторизованные пользователи обращаясь к любому контроллеру будут принудительно перенаправлены на страницу авторизации, установленную в конфиге (loginUrl).