Программирование, веб-кодинг

Yii2: Редирект на предыдущую страницу после авторизации пользователя

Redirect to the previous action after login

Разрабатывая систему с собственными переходами и перекидками пользователя в зависимости от его уровня доступа к той или иной странице (или даже части контента страницы), обязательно позаботьтесь о логичности всех перекидок. Пользователь не знает какие контроллеры и действия у вас есть и какие они выполняют функции. Поэтому когда пользователя перекидывает на страницу входа (например, чтобы дать ему увидеть скрытую информацию согласно его уровню доступа), он логинится со своим правильным именем+паролем, но после этого его вдруг кидает на главную страницу сайта - ясное дело, наступит недоумение и напряг в нём. Это косяк системы! Всё должно быть предельно просто.

Поэтому настройте редирект пользователей на предыдущую страницу после того, как он авторизуется.

Самое быстрое и ясное решение, это в общем контроллере в действии 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(), а так как мы в общем контроллере запомнили предыдущую страницу, куда надо вернуть-то пользователя, то всё отлично срабатывает.

Заботьтесь о пользователях ваших приложений!



Читайте также
18 марта 2017
... Программирование, веб-кодинг
Yii2: Ссылки на следующий и предыдущий пост
Полезно под текстом статьи дать ссылки на предыдущую и следующую статью для удобства ориентирования пользователя

27 января 2017
... Программирование, веб-кодинг, Расширения, виджеты
Yii2 GridView - виджет таблицы данных
Разбираемся как использовать виджет GridView в своих проектах