Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 27.04.2018 11:19:28

Нужна помощь по Auth::login()

Добрый день, уважаемые форумчане!
Прошу вашей помощи в освоении Лары.
1) Версия Laravel - 5.6.18
2) Версия php 7.2

Пытаюсь сделать активацию пользователей, смысл в том чтобы при попытке логина выбрасывалась страница, что пользователь не активирован.
Пробую сделать через слушатель события Login, код выглядит так:

EventServiceProvider:

    protected $listen = [
        'Illuminate\Auth\Events\Login' => [
            'App\Listeners\CheckConfirmUser',
            'App\Listeners\UpdateLastLogin',
        ],
    ];

CheckConfirmUser:

    public function handle(Login $event)
    {
        /* @var $user \App\Models\User */
        $user = $event->user;

        if ($user->confirmed_at === null)
            return redirect()->route('activation')->with(['id' => $user->id]);
    }

Проблема в том, что слушатель срабатывает, но не сбрасывает авторизацию, т.е. return не вызывает остановку выполнения кода, либо событие происходит уже после авторизации.

Не в сети

#2 27.04.2018 12:58:09

Re: Нужна помощь по Auth::login()

Вообщем решение так и не нашлось, подсмотрел как делают другие.
Решение не идеальное, но рабочее.
Выложу здесь, мало ли кому то пригодится:

App\Http\Kernel.php

protected $middlewareGroups = [
         ...
        'valid_user' => [
            'confirmed',
            'unblocked',
        ],
];

protected $routeMiddleware = [
        ...
        'confirmed' => \App\Http\Middleware\CheckConfirmUser::class,
        'unblocked' => \App\Http\Middleware\CheckBlockUser::class,
];

App\Http\Middleware\CheckBlockUser.php

    public function handle($request, Closure $next)
    {
        $user = Auth::user();
        
        if ($user && $user->blocked_at !== null)
            return redirect()->route('blocked');

        return $next($request);
    }

App\Http\Middleware\CheckConfirmUser.php

    public function handle($request, Closure $next)
    {
        if (config('settings.email_confirmation'))
        {
            $user = Auth::user();

            if ($user && $user->confirmed_at === null)
                return redirect()->route('confirmation')->with(['id' => $user->id]);
        }     
        
        return $next($request);
    }

routes\web.php

Route::group(['middleware' => ['valid_user']], function () {
     ...
});

Не в сети

#3 27.04.2018 17:58:56

Re: Нужна помощь по Auth::login()

Почему то не могу редактировать свое сообщение smile
Правильно добавить еще проверку на авторизацию, чтобы не дописывать везде отдельно, можно добавить в группу:

protected $middlewareGroups = [
         ...
        'valid_user' => [
            'auth',
            'confirmed',
            'unblocked',
        ],
];

Решение не идеально в том, что пользователь все таки авторизуется и приходится не забывать добавлять посредника smile

Изменено Hardoff (27.04.2018 17:59:17)

Не в сети

#4 28.04.2018 10:20:49

Re: Нужна помощь по Auth::login()

пользователь все таки авторизуется

Не авторизуется, а проходит аутентификацию. Это как раз тот случай, когда стОит заострить внимание на выборе правильного термина.

Ничего страшного, что пользователь вошел в систему, т.е. прошёл аутентификацию. Насколько я понимаю, все эти танцы нужны чтобы не дать ему выполнить некоторые действия — то есть отказать ему в авторизации на эти действия. Что-то можно, а что-то нельзя. Мидльвары и гейты отлично справятся с этим.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

Подвал раздела