Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день, уважаемые форумчане!
Прошу вашей помощи в освоении Лары.
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 не вызывает остановку выполнения кода, либо событие происходит уже после авторизации.
Не в сети
Вообщем решение так и не нашлось, подсмотрел как делают другие.
Решение не идеальное, но рабочее.
Выложу здесь, мало ли кому то пригодится:
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 () {
...
});
Не в сети
Почему то не могу редактировать свое сообщение
Правильно добавить еще проверку на авторизацию, чтобы не дописывать везде отдельно, можно добавить в группу:
protected $middlewareGroups = [
...
'valid_user' => [
'auth',
'confirmed',
'unblocked',
],
];
Решение не идеально в том, что пользователь все таки авторизуется и приходится не забывать добавлять посредника
Изменено Hardoff (27.04.2018 17:59:17)
Не в сети
пользователь все таки авторизуется
Не авторизуется, а проходит аутентификацию. Это как раз тот случай, когда стОит заострить внимание на выборе правильного термина.
Ничего страшного, что пользователь вошел в систему, т.е. прошёл аутентификацию. Насколько я понимаю, все эти танцы нужны чтобы не дать ему выполнить некоторые действия — то есть отказать ему в авторизации на эти действия. Что-то можно, а что-то нельзя. Мидльвары и гейты отлично справятся с этим.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Страницы 1