В этом руководстве мы узнаем, как настроить систему аутентификации Laravel 8 для перенаправления пользователей после регистрации или входа в систему по другому маршруту, в зависимости от их роли.
В большинстве случаев системы аутентификации, предоставляемой Laravel 8, достаточно для добавления функционала входа и регистрации в ваше веб-приложение.
Каркас аутентификации, который теперь перемещен в отдельный пакет laravel / ui, предоставляет готовые маршруты и представления для LoginController, RegisterController и ResetPasswordController, которые включены в ваш проект и отвечают за обеспечение функциональности системы аутентификации.
Обратите внимание, что команда Laravel рекомендует разработчикам использовать Jetstream для новых проектов Laravel 8, но они также обновили пакет laravel / ui до версии 3 для использования с Laravel 8, особенно если вы обновляете свое предыдущее приложение Laravel 7 до последней версии.
Перенаправление аутентификации Laravel 8 с использованием $ redirectTo
Если вы посмотрите, например, файл app/Http/Controllers/Auth/LoginController.php, вы найдете следующий код:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = '/home';
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
Вы можете видеть, что переменная $redirectTo существует и имеет значение /home, куда пользователи перенаправляются после входа в систему.
Во встроенной системе аутентификации Laravel вы можете настроить многие вещи, такие как маршрут перенаправления, используя переменную $redirectTo, которая существует как в контроллерах входа, так и в контроллерах регистрации.
Если вы хотите перенаправить своих пользователей на другие маршруты, отличные от маршрутов по умолчанию, после их регистрации или входа в систему, вам просто нужно изменить значение $redirectTo.
Перенаправление аутентификации Laravel 8 с использованием метода redirectTo ()
А что, если вы хотите перенаправить пользователей на другой маршрут в зависимости от некоторых критериев пользователя, таких как их роль?
Система аутентификации Laravel также покрывает это, предоставляя метод redirectTo(), который вы можете использовать вместо переменной $redirectTo.
Вот пример LoginController нашего приложения, добавив метод redirectTo() для перенаправления пользователей с правами администратора на другой маршрут, отличный от маршрута /home:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = '/home';
protected function redirectTo()
{
if (Auth::user()->hasRole('admin')) {
return '/admin';
}
return '/home';
}
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
Также нужно сделать это в контроллере регистрации. Откройте файл app/Http/Controllers/Auth/RegisterController.php и обновите его следующим образом:
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
class RegisterController extends Controller
{
use RegistersUsers;
protected $redirectTo = '/home';
protected function redirectTo()
{
if (auth()->user()->role == 'admin') {
return '/admin';
}
return '/home';
}
public function __construct()
{
$this->middleware('guest');
}
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
}
Вы можете удалить переменную $redirectTo или оставить ее, так как она будет просто переопределена методом redirectTo().