Sử dụng multiple authentication với auth guard trong laravel

Hello mọi người, hôm này mình sẽ chia sẻ cách xác thực nhiều loại users(có thể là users normal, users admin, users superadmin) ở trên nhiều tables khác nhau kết hợp với auth guard.Tùy vào yêu cầu của dự án mà bạn có thể xác thực các loại users khác nhau ở 2, 3 hoặc

Hello mọi người, hôm này mình sẽ chia sẻ cách xác thực nhiều loại users(có thể là users normal, users admin, users superadmin) ở trên nhiều tables khác nhau kết hợp với auth guard.Tùy vào yêu cầu của dự án mà bạn có thể xác thực các loại users khác nhau ở 2, 3 hoặc 4 tables, Ở bài viết này mình sẽ demo ở 2 tables users và admin nhé.
Trường hợp bạn không muốn xác thực người dùng bằng auth guard thì bạn có thể xem bài trước của mình nhé Sử dụng multiple authentication login trong laravel.
Bài viết này mình sẽ demo trên Larave 8, các bạn hãy xem các ví dụ bên dưới nhé.

Step 1: Setting Auth Config

Hãy cập nhật mảng guards, providers như bên dưới.
config/auth.php

'guards'=>['web'=>['driver'=>'session','provider'=>'users',],'admin'=>['driver'=>'session','provider'=>'admins',],],'providers'=>['users'=>['driver'=>'eloquent','model'=>AppModelsUser::class,],'admins'=>['driver'=>'eloquent','model'=>AppModelsAdmin::class,]],

Step 2: Create Models

Trong bước này mình sẽ tạo 2 modes cho User và Admin.
App/Models/User.php

<?phpnamespaceAppModels;useIlluminateContractsAuthMustVerifyEmail;useIlluminateDatabaseEloquentFactoriesHasFactory;useIlluminateFoundationAuthUseras Authenticatable;useIlluminateNotificationsNotifiable;classUserextendsAuthenticatable{useHasFactory, Notifiable;/**
     * The attributes that are mass assignable.
     *
     * @var array
     */protected$fillable=['name','email','password',];/**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */protected$hidden=['password','remember_token',];/**
     * The attributes that should be cast to native types.
     *
     * @var array
     */protected$casts=['email_verified_at'=>'datetime',];}

app/Models/Admin.php

<?phpnamespaceAppModels;useIlluminateFoundationAuthUseras Authenticatable;classAdminextendsAuthenticatable{/**
     * The attributes that are mass assignable.
     *
     * @var array
     */protected$fillable=['name','email','password'];/**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */protected$hidden=['password','remember_token',];}

Step 3: Create Route and Controller

Cập nhật route trong file web.php, route này dùng cho xác thực users normal.
routes/web.php

<?phpuseIlluminateSupportFacadesRoute;Route::get('web-login','UserAuth[email protected]');Route::post('web-login',['as'=>'web-login','uses'=>'UserAuth[email protected]']);

Tiếp theo mình tạo mới route admin.php, route này dùng cho xác thực users admin.
routes/admin.php

<?phpuseIlluminateSupportFacadesRoute;Route::get('admin-login','AdminAuth[email protected]');Route::post('admin-login',['as'=>'admin-login','uses'=>'AdminAuth[email protected]']);

Tạo thư mực mới User/Auth trong Controller và thêm code vào file app/Http/Controller/User/Auth/LoginController.php.
File này sẽ xử lý logic liên quan đến users normal.
app/Http/Controller/User/Auth/LoginController.php

<?phpnamespaceAppHttpControllersUserAuth;useAppModelsUser;useValidator;useAppHttpControllersController;useAppProvidersRouteServiceProvider;useIlluminateFoundationAuthAuthenticatesUsers;useIlluminateHttpRequest;classLoginControllerextendsController{/*
    |--------------------------------------------------------------------------
    | 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.
    |
    */useAuthenticatesUsers;/**
     * Where to redirect users after login.
     *
     * @var string
     */protected$redirectTo=RouteServiceProvider::HOME;/**
     * Create a new controller instance.
     *
     * @return void
     */publicfunction__construct(){$this->middleware('guest')->except('logout');}publicfunctionwebLogin(){returnview('user.webLogin');}publicfunctionwebLoginPost(Request$request){$this->validate($request,['email'=>'required|email','password'=>'required',]);if(auth()->attempt(['email'=>$request->input('email'),'password'=>$request->input('password')])){$user=auth()->user();dd($user);}else{returnback()->with('error','your username and password are wrong.');}}}

Tạo thư mực mới Admin/Auth trong Controller và thêm code vào file app/Http/Controller/Admin/Auth/LoginController.php
File này sẽ xử lý logic liên quan đến users admin.
app/Http/Controller/Admin/Auth/LoginController.php

<?phpnamespaceAppHttpControllersAdminAuth;useAppModelsAdmin;useValidator;useAppHttpControllersController;useAppProvidersRouteServiceProvider;useIlluminateFoundationAuthAuthenticatesUsers;useIlluminateHttpRequest;classLoginControllerextendsController{/*
    |--------------------------------------------------------------------------
    | 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.
    |
    */useAuthenticatesUsers;/**
     * Where to redirect users after login.
     *
     * @var string
     */protected$redirectTo=RouteServiceProvider::HOME;/**
     * Create a new controller instance.
     *
     * @return void
     */publicfunction__construct(){$this->middleware('guest')->except('logout');}publicfunctionadminLogin(){returnview('admin.adminLogin');}publicfunctionadminLoginPost(Request$request){$this->validate($request,['email'=>'required|email','password'=>'required',]);if(auth()->guard('admin')->attempt(['email'=>$request->input('email'),'password'=>$request->input('password')])){$user=auth()->guard('admin')->user();dd($user);}else{returnback()->with('error','your username and password are wrong.');}}}

Step 4: Create Blade

Màn hình login cho users normal.
resources/views/user/webLogin.blade.php

@extends('layouts.app')


@section('content')<div class="container"><div class="row"><div class="col-md-8 col-md-offset-2"><div class="panel panel-default"><div class="panel-heading">Login</div><div class="panel-body"><form class="form-horizontal" role="form" method="POST" action="{{ route('web-login') }}">{!!csrf_field()!!}<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}"><label class="col-md-4 control-label">E-Mail Address</label><div class="col-md-6"><input type="email"class="form-control" name="email" value="{{ old('email') }}">
                                @if($errors->has('email'))<span class="help-block"><strong>{{$errors->first('email')}}</strong></span>
                                @endif</div></div><div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}"><label class="col-md-4 control-label">Password</label><div class="col-md-6"><input type="password"class="form-control" name="password">
                                @if($errors->has('password'))<span class="help-block"><strong>{{$errors->first('password')}}</strong></span>
                                @endif</div></div><div class="form-group"><div class="col-md-6 col-md-offset-4"><button type="submit"class="btn btn-primary"><i class="fa fa-btn fa-sign-in"></i>Login
                                </button><a class="btn btn-link" href="{{ url('/password/reset') }}">Forgot Your Password?</a></div></div></form></div></div></div></div></div>
@endsection

Màn hình login cho users admin.
resources/views/admin/adminLogin.blade.php

@extends('layouts.app')


@section('content')<div class="container"><div class="row"><div class="col-md-8 col-md-offset-2"><div class="panel panel-default"><div class="panel-heading">Login</div><div class="panel-body"><form class="form-horizontal" role="form" method="POST" action="{{ route('admin-login') }}">{!!csrf_field()!!}<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}"><label class="col-md-4 control-label">E-Mail Address</label><div class="col-md-6"><input type="email"class="form-control" name="email" value="{{ old('email') }}">
                                @if($errors->has('email'))<span class="help-block"><strong>{{$errors->first('email')}}</strong></span>
                                @endif</div></div><div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}"><label class="col-md-4 control-label">Password</label><div class="col-md-6"><input type="password"class="form-control" name="password">
                                @if($errors->has('password'))<span class="help-block"><strong>{{$errors->first('password')}}</strong></span>
                                @endif</div></div><div class="form-group"><div class="col-md-6 col-md-offset-4"><button type="submit"class="btn btn-primary"><i class="fa fa-btn fa-sign-in"></i>Login
                                </button><a class="btn btn-link" href="{{ url('/password/reset') }}">Forgot Your Password?</a></div></div></form></div></div></div></div></div>
@endsection

Cuối cùng chạy và kiểm tra kết quả nhé.

Demo màn hình login của user normal.

Demo màn hình login của user admin.

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ