Разрабатывая систему с собственными переходами и перекидками пользователя в зависимости от его уровня доступа к той или иной странице (или даже части контента страницы), обязательно позаботьтесь о логичности всех перекидок. Пользователь не знает какие контроллеры и действия у вас есть и какие они выполняют функции. Поэтому когда пользователя перекидывает на страницу входа (например, чтобы дать ему увидеть скрытую информацию согласно его уровню доступа), он логинится со своим правильным именем+паролем, но после этого его вдруг кидает на главную страницу сайта - ясное дело, наступит недоумение и напряг в нём. Это косяк системы! Всё должно быть предельно просто.
Поэтому настройте редирект пользователей на предыдущую страницу после того, как он авторизуется.
Самое быстрое и ясное решение, это в общем контроллере в действии init() запоминать текущую страницу, на которой находится незалогиненный пользователь
class BaseController extends Controller { public function init() { $this->on('beforeAction', function ($event) { // запоминаем страницу неавторизованного пользователя, чтобы потом отредиректить его обратно с помощью goBack() if (Yii::$app->getUser()->isGuest) { $request = Yii::$app->getRequest(); // исключаем страницу авторизации или ajax-запросы if (!($request->getIsAjax() || strpos($request->getUrl(), 'login') !== false)) { Yii::$app->getUser()->setReturnUrl($request->getUrl()); } } }); }
Дальше, если вы используете модуль yii2-user, то теперь можно и нужно в конфиге в controllerMap удалить все принудительные редиректы по событию "после залогинивания" (я закомментировал их)
... 'modules' => [ 'user' => [ 'class' => \dektrium\user\Module::className(), 'admins' => ['adminname'], 'enableConfirmation' => false, 'modelMap' => [ 'User' => 'app\models\User', 'UserSearch' => 'app\models\UserSearch', 'Profile' => 'app\models\Profile', ], 'controllerMap' => [ 'profile' => 'app\controllers\user\ProfileController', 'security' => [ 'class' => \dektrium\user\controllers\SecurityController::className(), 'on ' . \dektrium\user\controllers\SecurityController::EVENT_AFTER_LOGIN => function ($e) { /*if (Yii::$app->user->can('student free')) { Yii::$app->response->redirect(array('/course'))->send(); } if (Yii::$app->user->can('admin')) { Yii::$app->response->redirect('http://site.ru/user/')->send(); }*/ //Yii::$app->response->redirect(Yii::$app->request->referrer)->send(); // Yii::$app->response->redirect(array('/user/'.Yii::$app->user->id))->send(); //Yii::$app->end(); } ], ], ],...
Это делаем, потому что в модуле yii2-user уже в действии login происходит редирект функцией goBack(), а так как мы в общем контроллере запомнили предыдущую страницу, куда надо вернуть-то пользователя, то всё отлично срабатывает.
Заботьтесь о пользователях ваших приложений!
12 марта 2017, Программирование, веб-кодинг

