Hướng dẫn cấu hình nhiều guard trong ứng dụng Laravel
Trong bài viết này, mình muốn chia sẻ về cách mình cấu hình nhiều guard trong 1 dự án Laravel mà mình từng làm.
Xin chào mọi người, hôm nay có thời gian rảnh nên mình ngồi viết lại quy trình các bước cấu hình nhiều guard trong một ứng dụng Laravel mà mình đã từng làm việc.
Chúng ta bắt đầu thôi nào! Đầu tiên, các bạn mở terminal lên giúp mình(ở đây mình dùng macbook) và gõ lệnh:
composer require laravel/ui
hi gói laravel/ui đã được cài đặt, bạn có thể cài đặt giao diện người dùng của trang đăng kí/đăng nhập bằng cách chạy lệnh sau:
php artisan ui bootstrap --auth php artisan ui vue --auth php artisan ui react --auth
Sau khi cài đặt gói laravel/ui Composer và tạo giao diện trang đăng kí/đăng nhập, tệp pack.json của Laravel sẽ bao gồm gói bootstrap để giúp chúng ta bắt đầu tạo giao diện trang đăng kí/đăng nhập bằng tệp Bootstrap. Bây giờ bạn chạy lệnh sau:
npm install & npm run dev
Sau khi chạy lệnh trên, Laravel sẽ biên dịch ra 2 file app.css và app.js, lúc này chúng ta sẽ có giao diện sử dụng Bootstrap rồi.
Tiếp theo, bạn mở file app/config/auth.php và sửa đoạn code sau và lưu lại:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], // 'users' => [ // 'driver' => 'database', // 'table' => 'users', // ], ],
Bước tiếp theo, chúng ta đi tạo file Admin.php ở thử mục app/Models. Mình hay copy file User.php và đổi tên file, tên class Thành Admin.php và Admin.
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; class Admin extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; protected $table = 'admins'; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for serialization. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast. * * @var array */ protected $casts = [ 'email_verified_at' => 'datetime', ]; }
Bước tiếp theo, Ở file app/Providers/RouteServiceProvider.php bạn thêm cho mình dòng sau:
public const ADMIN_HOME = '/admin/dashboard';
Sau đó thì bạn tạo thêm file AdminLoginController.php trong thư mục app/Http/Controllers/Auth/ với nội dung như sau:
namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class AdminLoginController 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::ADMIN_HOME; /** * Create a new controller instance. * * @return void */ public function __construct() { $this--->middleware('guest:admin')->except('logout'); } public function showLoginForm() { return view('admin.auth.login'); } public function logout(Request $request) { $this->guard()->logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); if ($response = $this->loggedOut($request)) { return $response; } return $request->wantsJson() ? new JsonResponse([], 204) : redirect()->route('admin.login'); } /** * The user has logged out of the application. * * @param \Illuminate\Http\Request $request * @return mixed */ protected function loggedOut(Request $request) { // } /** * Get the guard to be used during authentication. * * @return \Illuminate\Contracts\Auth\StatefulGuard */ protected function guard() { return Auth::guard('admin'); } }
Tiếp theo bạn mở file app/Http/Middleware/Authenticate.php và sửa lại hàm redirectTo thành như sau:
if (! $request->expectsJson()) { if($request->is(['admin', 'admin/*'])) { return route('admin.login'); } return route('login'); }
Sửa nội dung hàm handle trong file app/Http/Middleware/RedirectIfAuthenticated.php thành như sau:
$guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { if ($guard == 'admin' && Auth::guard($guard)->check()) { return redirect(RouteServiceProvider::ADMIN_HOME); } if (Auth::guard($guard)->check()) { return redirect(RouteServiceProvider::HOME); } } return $next($request);
Sau đó mở trình duyệt lên và gõ localhost:8000/admin/login và xem kết quả. Chúc bạn test thử thành công!