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

Sự Khác Nhau Giữa Domain và Hosting Là Gì?

Sự khác nhau giữa domain và hosting là gì? Bài này giải thích ngắn và dễ hiểu nh

Shared Hosting hay VPS Hosting: Lựa chọn nào dành cho bạn?

Bài viết giải thích rõ shared hosting và vps hosting là gì và hướng dẫn chọn lựa

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dưới đây hoạt động tốt có 1 lỗi không update được postmeta ” meta_key=