Сначала нам нужно загрузить новое приложение laravel, используя следующую команду.

composer create-project laravel/laravel laravel-multi-auth

Теперь перейдите в каталог проекта.

cd laravel-multi-auth

1-) Настройка подключения к базе данных

Установите соединение с базой данных, откройте файл .env и определите детали вашей базы данных, это обеспечит консенсус между laravel и базой данных.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

2-) Настройка миграции и модели

Затем добавьте столбец is_admin в таблицу пользователей, используя файл миграции. Итак, откройте файл миграции create_users_table.php, который находится в базе данных/миграции, и обновите следующее поле для администратора.

<?php
  
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
  
return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->tinyInteger('type')->default(0);
            /* Users: 0=>User, 1=>Admin, 2=>Manager */
            $table->rememberToken();
            $table->timestamps();
        });
    }
  
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
};

Затем откройте app/User.php и обновите приведенное ниже имя поля is_admin здесь:

<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use Illuminate\Database\Eloquent\Casts\Attribute;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
protected $fillable = [
'name',
'email',
'password',
'type'
];
protected $hidden = [
'password',
'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
protected function type(): Attribute
{
return new Attribute(
get: fn ($value) =>  ["user", "admin", "manager"][$value],
);
}
}

Теперь добавьте поле is_admin, после чего будет использоваться приведенная ниже команда для создания этого поля в базе данных.

php artisan migrate

Теперь создайте встроенную систему аутентификации. Используйте приведенную ниже команду для создания системы аутентификации по умолчанию в laravel. И измените встроенную систему аутентификации laravel на систему множественной аутентификации.

Эта команда создаст файлы маршрутов, контроллеров и представлений для аутентификации и регистрации входа в Laravel. Это означает предоставить базовую аутентификацию и регистрацию входа в систему laravel. Полная система. Давайте откроем командную строку и введем следующую команду.

3-) Затем установите пользовательский интерфейс laravel 9 в свой проект, используя следующую команду:

composer require laravel/ui

Теперь выполните приведенную ниже команду на терминале для создания блейд-файлов входа, регистрации, сброса пароля и сброса пароля:

php artisan ui bootstrap --auth

Затем выполните следующие команды:

npm install
npm run dev

4-) Создать промежуточное ПО UserAccess

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

php artisan make:middleware UserAccess

приложение/Http/middleware/UserAccess.php

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class UserAccess
{
/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next, $userType)
{
if(auth()->user()->type == $userType){
return $next($request);
}
return response()->json(['You do not have permission to access for this page.']);
/* return response()->view('errors.check-permission'); */
}
}

приложение/Http/Kernel.php

....
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'user-access' => \App\Http\Middleware\UserAccess::class,
];
....

5-) Создать маршруты

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

маршруты/web.php

<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HomeController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
/*------------------------------------------
--------------------------------------------
All Normal Users Routes List
--------------------------------------------
--------------------------------------------*/
Route::middleware(['auth', 'user-access:user'])->group(function () {
Route::get('/home', [HomeController::class, 'index'])->name('home');
});
/*------------------------------------------
--------------------------------------------
All Admin Routes List
--------------------------------------------
--------------------------------------------*/
Route::middleware(['auth', 'user-access:admin'])->group(function () {
Route::get('/admin/home', [HomeController::class, 'adminHome'])->name('admin.home');
});
/*------------------------------------------
--------------------------------------------
All Admin Routes List
--------------------------------------------
--------------------------------------------*/
Route::middleware(['auth', 'user-access:manager'])->group(function () {
Route::get('/manager/home', [HomeController::class, 'managerHome'])->name('manager.home');
});

6-) Обновить контроллер

Здесь нам нужно добавить метод adminHome() и managerHome для маршрута администратора в HomeController. поэтому давайте добавим, как показано ниже:

приложение/Http/Controllers/HomeController.php

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index()
{
return view('home');
}
public function adminHome()
{
return view('adminHome');
}
public function managerHome()
{
return view('managerHome');
}}

7-) Настроить вид блейда

Откройте предварительно определенный файл resources/views/home.blade.php и вставьте в него основной код.

@extends('layouts.app')
@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Dashboard</div>
                <div class="card-body">
                    @if(session('login-success'))
                        <div class="alert alert-success" role="alert">
                            {{ session('login-success') }}
                        </div>
                    @endif
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif
                    You are normal user.
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Создайте и откройте файл resources/views/admin-home.blade.php и добавьте код.

@extends('layouts.app')
@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Dashboard</div>
                <div class="card-body">
                    @if(session('login-success'))
                        <div class="alert alert-success" role="alert">
                            {{ session('login-success') }}
                        </div>
                    @endif
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif
                    You are admin.
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

8-) Настроить контроллер входа в систему

На этом шаге мы настроим класс LoginController, определим метод login() и вставим следующий код. Он обрабатывает проверку на стороне сервера, перенаправляет на панель администратора, если вошедший в систему пользователь является администратором.

Включите следующий код в файл app/Http/Controllers/Auth/LoginController.php.

<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */
    use AuthenticatesUsers;
    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::HOME;
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }
    public function login(Request $request)
    {
        $request->validate([
            'email'     => 'required|email',
            'password'  => 'required'
        ]);
        $credentials = $request->only('email', 'password');
        if(! auth()->attempt($credentials)){
            return redirect()->route('login')
                ->with('error','Email-Address And Password Are Wrong.');
        }
        if (auth()->user()->is_admin == 1) {
            return redirect()->route('admin.home');
        }
        return redirect()->route('home');
    }
}

9-) Создайте фиктивные данные с помощью Seeder

Поэтому создайте userseeder с помощью следующей команды:

php artisan make:seeder UsersSeeder

Теперь откройте файл database/seeds/UsersSeeder.php и вставьте следующие данные.

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
class UsersSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $usersData = [
            [
               'name'   =>'Admin',
               'email'  =>'[email protected]',
               'is_admin' => 1,
               'password' => Hash::make('12345678')
            ],
            [
               'name'       => 'User',
               'email'      => '[email protected]',
               'is_admin'   => 0,
               'password'   => Hash::make('12345678')
            ],
        ];
        foreach ($usersData as $key => $val) {
            User::create($val);
        }
    }
}

10-) Запустите приложение Laravel Multi Auth и протестируйте

Вызовите приложение laravel multi auth с помощью приведенной ниже команды.

php artisan serve

Откройте в браузере следующий URL: http://127.0.0.1:8000/login

Панель администратора:

Используйте следующие учетные данные для панели администратора:

Email: [email protected]
Password: 12345678

Вот это представление вы увидите после входа в систему с использованием роли администратора

Панель пользователя:

Используйте следующие учетные данные для панели администратора:

Email: [email protected]
Password: 12345678

Вот это представление вы увидите после входа в систему с использованием обычного входа пользователя

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