Laravel 5.4: Перенаправление на пользовательский URL после входа в систему
У меня возникла проблема с аутентификацией в приложении на Laravel версии 5.4.10. Я использую стандартный механизм аутентификации, который предоставляет команда
php artisan make:auth
Мне нужно защитить все приложение и перенаправлять пользователей на /themes после входа в систему.
У меня есть четыре контроллера: ForgotPasswordController.php, LoginController.php, RegisterController.php и ResetPasswordController.php. Я добавил следующую строку в последние три контроллера:
protected $redirectTo = '/themes';
Первая строка в файле routes/web.php выглядит так:
Auth::routes();
Я добавил следующий конструктор в Controller.php:
public function __construct()
{
$this->middleware('auth');
}
Также я изменил файл app/Http/Middleware/RedirectIfAuthenticated.php, так что функция handle теперь выглядит следующим образом:
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/themes');
}
return $next($request);
}
Все настроено исправно, но когда я нажимаю кнопку Войти, меня перенаправляет на "/", а не на "/themes". Если я не требую аутентификацию в контроллерах (т.е. не добавляю __construct в файл Controller.php), то перенаправление работает корректно после входа в систему. Что я делаю не так?
5 ответ(ов)
Чтобы добавить функциональность перенаправления пользователей в зависимости от их роли в вашем LoginController, вам нужно внести следующие изменения в код контроллера:
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| Этот контроллер отвечает за аутентификацию пользователей в приложении и
| перенаправление их на главный экран. Контроллер использует трейт
| для удобного предоставления своей функциональности в ваших приложениях.
|
*/
use AuthenticatesUsers;
protected function authenticated(Request $request, $user)
{
if ($user->isAdmin()) {
// выполняйте ваши действия здесь
return redirect()->route('dashboard');
}
return redirect('/home');
}
/**
* Куда перенаправлять пользователей после входа.
*
* @var string
*/
//protected $redirectTo = '/admin';
/**
* Создание нового экземпляра контроллера.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest', ['except' => 'logout']);
}
}
Вы ставите проверку роли пользователя в методе authenticated
, который вызывается сразу после успешной аутентификации. Если пользователь является администратором, вы перенаправляете его на маршрут dashboard
, в противном случае - на главную страницу /home
. Не забудьте убедиться, что метод isAdmin()
корректно определен в вашей модели пользователя.
Если вы посмотрите на трейте AuthenticatesUsers
, вы увидите, что в методе sendLoginResponse
происходит вызов $this->redirectPath()
. Если изучить этот метод, то вы узнаете, что redirectTo
может быть определен как метод или переменная.
Вот что у меня сейчас в контроллере аутентификации:
public function redirectTo() {
$user = Auth::user();
switch(true) {
case $user->isInstructor():
return '/instructor';
case $user->isAdmin():
case $user->isSuperAdmin():
return '/admin';
default:
return '/account';
}
}
Таким образом, в зависимости от роли пользователя (инструктор, администратор или супер администратор) происходит переадресация на соответствующий маршрут. Если ни одно из условий не выполняется, пользователя перенаправляют на страницу аккаунта. Это позволяет легко управлять маршрутами в зависимости от уровня доступа пользователя.
Чтобы реализовать редирект пользователя в зависимости от его роли в Laravel, можно использовать трейта AuthenticatesUsers
, который уже встроен в контроллер аутентификации. Вам нужно добавить метод authenticated
в ваш контроллер логина.
Вот шаги, которые нужно выполнить:
Откройте файл контроллера аутентификации, обычно он находится по пути:
\App\Http\Controllers\Auth\LoginController.php
.Добавьте следующий метод в этот контроллер:
/**
* Проверяем роль пользователя и перенаправляем его в зависимости от роли
* @return \Illuminate\Http\RedirectResponse
*/
public function authenticated()
{
if (auth()->user()->hasRole('admin')) {
return redirect('/admin/dashboard');
}
return redirect('/user/dashboard');
}
Таким образом, после успешной аутентификации пользователя, метод authenticated
проверит, имеет ли пользователь роль "admin". Если да, он будет перенаправлен на административную панель, в противном случае — на панель пользователя. Это простой и эффективный способ управлять перенаправлением на основе ролей пользователей в вашем приложении.
Для более новых версий Laravel замените строку protected $redirectTo = RouteServiceProvider::HOME;
на protected $redirectTo = '/newurl';
, при этом замените newurl
на нужный вам путь.
Тестировалось на версии Laravel 6.
Вы должны установить значение $redirectTo
на маршрут, на который хотите перенаправить пользователей после логина или регистрации. Это можно сделать в конструкторе класса AuthController
.
Вот пример кода:
/**
* Куда перенаправлять пользователей после входа / регистрации.
*
* @var string
*/
protected $redirectTo = '/';
/**
* Создает новый экземпляр контроллера аутентификации.
*
* @return void
*/
public function __construct()
{
$this->middleware($this->guestMiddleware(), ['except' => 'logout']);
$this->redirectTo = route('dashboard'); // Здесь устанавливаем маршрут для перенаправления
}
В этом коде $redirectTo
устанавливается на маршрут, который вы определили как 'dashboard'. Это означает, что пользователи будут перенаправлены на страницу контрольной панели после успешного входа или регистрации.
Как сделать редирект в PHP?
Как удалить модель с помощью php artisan?
Форматирование часового пояса для даты Carbon
Laravel 5: Ошибка SQLSTATE[HY000] [1045] Доступ запрещён для пользователя 'homestead'@'localhost' (используется пароль: ДА)
Schema Builder: Создание таблицы, если она не существует