В этом руководстве мы узнаем, как настроить систему аутентификации 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().

15-10-2021