Як налаштувати багатофакторну авторизацію з кастомним входом у Laravel 11

Крок 1 : створення нового проекту Laravel

composer create-project laravel/laravel laravelapp --prefer-dist

Крок 2 : додавання нового стовпця до файлу міграції для користувачів

Schema::create('users', function (Blueprint $table) {  
 $table->id();  
 $table->string('name');  

 //додаємо стовпець для збереження ролі користувача  
 $table->enum('role', ['admin', 'customer'])->default('customer');  

 $table->string('email')->unique();  
 $table->timestamp('email_verified_at')->nullable();  
 $table->string('password');  
 $table->rememberToken();  
 $table->timestamps();  
 });

Крок 3 : додавання тестових даних у сидер

public function run(): void  
 {  
 User::factory()->create([  
 'name' => 'Admin',  
 'email' => '[email protected]',  
 'role' => 'admin',  
 'password' => '1234'  
 ]);  

 User::factory()->create([  
 'name' => 'Customer',  
 'email' => '[email protected]',  
 'role' => 'customer',  
 'password' => '1234'  
 ]);  
 }

Крок 4 : запуск міграції з сидером

php artisan migrate --seed
```

Крок 5 : створення представлень

php artisan make:view login  
php artisan make:view admin/dashboard  
php artisan make:view customer/dashboard

Крок 6 : створення контролерів

php artisan make:controller AuthController  
php artisan make:controller AdminController  
php artisan make:controller CustomerController

Крок 7 : додавання наступного методу в модель User

public function hasRole($role)  
 {  
 return $this->role === $role;  
 }

Крок 8 : створення маршрутів

group(function(){  

 Route::get('/', function () {  
 return view('welcome');  
 });  

 Route::view('/login', 'login')->name('login');  
 Route::post('/login', [AuthController::class, 'login']);  

});
Route::middleware('auth')->group(function(){  

 // Маршрут для панелі адміністратора  
 Route::middleware(['role:admin'])->group(function () {  
 Route::get('/admin/dashboard', [AdminController::class, 'index'])->name('admin.dashboard');  
 });  

 // Маршрут для панелі клієнта  
 Route::middleware(['role:customer'])->group(function () {  
 Route::get('/customer/dashboard', [CustomerController::class, 'index'])->name('customer.dashboard');  
 });  

 Route::get('/logout', function(){  
 Auth::logout();  
 });  
});

Крок 9 : додавання необхідного коду до файлів представлень

  • welcome.blade.php










welcome
login
       ```  - login.blade.php  ``` 
        @csrf


- admin/dashboard.blade.php

панель адміністратора
- customer/dashboard.blade.php
панель клієнта
Крок 10 : додавання необхідного коду до контролерів - AuthController.php only('email', 'password'); if (auth()->attempt($credentials)) { $user = auth()->user(); // Перенаправлення в залежності від ролі if ($user->role === 'admin') { return redirect()->route('admin.dashboard'); } elseif ($user->role === 'customer') { return redirect()->route('customer.dashboard');
}
}

return back()->withErrors(['message' => 'Невірні облікові дані']);
}

}
```

  • AdminController.php

    • @paramSymfony\Component\HttpFoundation\Response) $next
      */
      public function handle(Request $request, Closure $next, $role): Response
      {
      if (auth()->check() && auth()->user()->role === $role) {
      return $next($request);
      }
      return redirect()->route('login')->withErrors(['message' => 'Доступ заборонено.']);
      }
      }
      ```
  • RedirectIfAuthenticated.php
check()) {  
 $user = Auth::guard($guard)->user();  

 // Перенаправлення на основі ролі  
 if ($user->hasRole('admin')) {  
 return redirect()->route('admin.dashboard');  
 }  

 if ($user->hasRole('customer')) {  
 return redirect()->route('customer.dashboard');  
 }  

 // Резервне перенаправлення  
 return redirect('/home');  
 }  
 }  

 return $next($request);  
 }  
}

Крок 13: додайте псевдоніми для middleware в app.php та перепишіть стандартний middleware для гостя

  • bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {  
 $middleware->alias([  
 'role' => RoleMiddleware::class,  
 'guest' => RedirectIfAuthenticated::class  
 ]);  
 })

Тепер запустіть проєкт.
Дякуємо, що були з нами!

Перекладено з: How to Set Up Multi-Auth with a Custom Login System in Laravel 11

Leave a Reply

Your email address will not be published. Required fields are marked *