Sử dụng multiple authentication login trong laravel

Hello mọi người, trong bài viết này mình sẽ chia sẻ cách sử dụng multiple auth login sử dụng middleware với một table là users. Ở ví dụ này mình sẽ demo ở trên laravel 8, các bạn hãy theo dõi các bước bên dưới để hiểu hơn nhé. Step 1: Cập nhật file Migration

Hello mọi người, trong bài viết này mình sẽ chia sẻ cách sử dụng multiple auth login sử dụng middleware với một table là users.
Ở ví dụ này mình sẽ demo ở trên laravel 8, các bạn hãy theo dõi các bước bên dưới để hiểu hơn nhé.

Step 1: Cập nhật file Migration và Model user

Trong bước này mình sẽ thêm row “is_admin” vào table users và model
database/migrations/000_create_users_table.php

<?phpuseIlluminateDatabaseMigrationsMigration;useIlluminateDatabaseSchemaBlueprint;useIlluminateSupportFacadesSchema;classCreateUsersTableextendsMigration{/**
     * Run the migrations.
     *
     * @return void
     */publicfunctionup(){Schema::create('users',function(Blueprint$table){$table->id();$table->string('name');$table->string('email');$table->timestamp('email_verified_at')->nullable();$table->boolean('is_admin')->nullable();$table->string('password');$table->rememberToken();$table->timestamps();});}/**
     * Reverse the migrations.
     *
     * @return void
     */publicfunctiondown(){Schema::dropIfExists('users');}}

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','is_admin'];/**
     * 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',];}

Tiếp theo chạy migration bằng command bên dưới.

php artisan migrate

Step 2: Create Auth using scaffold

Bước này mình sẽ tạo sẵn một số files cho các màn hình login, register, dashboard bằng command bên dưới.
Laravel 8 UI Package

Laravel 8 UI Package

Generate auth

php artisan ui bootstrap --auth 
npm install
npm run dev

Step 3: Create IsAdmin Middleware

Trong bước này, mình sẽ tạo middleware cho admin, middleware này chỉ cho phép admin user mới có quyền truy cập .

php artisan make:middleware IsAdmin

app/Http/middleware/IsAdmin.php

<?php
  
namespaceAppHttpMiddleware;useClosure;classIsAdmin{/**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */publicfunctionhandle($request,Closure$next){if(auth()->user()->is_admin==1){return$next($request);}returnredirect(‘home’)->with(‘error’,"You don't have admin access.");}}

Thêm đoạn ‘is_admin’ => AppHttpMiddlewareIsAdmin::class vào file bên dưới.
app/Http/Kernel.php

protected$routeMiddleware=['auth'=>AppHttpMiddlewareAuthenticate::class,'auth.basic'=>IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,'cache.headers'=>IlluminateHttpMiddlewareSetCacheHeaders::class,'can'=>IlluminateAuthMiddlewareAuthorize::class,'guest'=>AppHttpMiddlewareRedirectIfAuthenticated::class,'password.confirm'=>IlluminateAuthMiddlewareRequirePassword::class,'signed'=>IlluminateRoutingMiddlewareValidateSignature::class,'throttle'=>IlluminateRoutingMiddlewareThrottleRequests::class,'verified'=>IlluminateAuthMiddlewareEnsureEmailIsVerified::class,'is_admin'=>AppHttpMiddlewareIsAdmin::class,];

Step 4: Create Route

Ở bước này mình sẽ tạo một route cho màn hình trang chủ của admin user, normal user.
routes/web.php

<?phpuseIlluminateSupportFacadesRoute;useAppHttpControllersHomeController;/*
|--------------------------------------------------------------------------
| 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('admin/home',[HomeController::class,'adminHome'])->name('admin.home')->middleware('is_admin');Route::get('home',[HomeController::class,'index'])->name('home');

Step 5: Add Method on Controller

Bước này mình sẽ thêm 2 methods là index(), adminHome() trong HomeController.
Khi admin user login thành công thì sẽ redirect vào method adminHome().
Khi normal user login thành công thì sẽ redirect vào method index().
Các bạn hãy cập nhật code như bên dưới nhé.
app/Http/Controllers/HomeController.php

<?phpnamespaceAppHttpControllers;useIlluminateHttpRequest;classHomeControllerextendsController{/**
     * Create a new controller instance.
     *
     * @return void
     */publicfunction__construct(){$this->middleware('auth');}/**
     * Show the application dashboard.
     *
     * @return IlluminateContractsSupportRenderable
     */publicfunctionindex(){returnview('home');}/**
     * Show the application dashboard.
     *
     * @return IlluminateContractsSupportRenderable
     */publicfunctionadminHome(){returnview('adminHome');}}

Step 6: Create Blade file

Màn hình này sẽ hiển thị khi normal user login thành công.
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">
                    You are normal user.</div></div></div></div></div>
@endsection

Màn hình này sẽ hiển thị khi admin user login thành công.
resources/views/adminHome.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">
                    You are Admin.</div></div></div></div></div>
@endsection

Thêm code bên dưới vào file layout để style cho giao diện nhé.
resourcesviewslayoutsapp.blade.php

    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>

Step 7: Update on LoginController

Trong method login này, nếu normal user login thành công thì sẽ redirect to home route và nếu admin user login thành công thì redirect về admin route.
Các bạn hãy cập nhật code như bên dưới .
app/Http/Controllers/Auth/LoginController.php

<?phpnamespaceAppHttpControllersAuth;useAppHttpControllersController;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='/home';/**
     * Create a new controller instance.
     *
     * @return void
     */publicfunction__construct(){$this->middleware('guest')->except('logout');}publicfunctionlogin(Request$request){$input=$request->all();$this->validate($request,['email'=>'required|email','password'=>'required',]);if(auth()->attempt(array('email'=>$input['email'],'password'=>$input['password']))){if(auth()->user()->is_admin==1){returnredirect()->route('admin.home');}else{returnredirect()->route('home');}}else{returnredirect()->route('login')->with('error','Email-Address And Password Are Wrong.');}}}

Step 8: Create Seeder

Mình sẽ sử dụng seeder để tạo mới account admin user và normal user như bên dưới.

php artisan make:seeder CreateUsersSeeder

database/seeds/CreateUsersSeeder.php

<?phpuseIlluminateDatabaseSeeder;useAppModelsUser;classCreateUsersSeederextendsSeeder{/**
     * Run the database seeds.
     *
     * @return void
     */publicfunctionrun(){$user=[['name'=>'Admin','email'=>'[email protected]','is_admin'=>'1','password'=>bcrypt('123456'),],['name'=>'User','email'=>'[email protected]','is_admin'=>'0','password'=>bcrypt('123456'),],];foreach($useras$key=>$value){User::create($value);}}}

Bây giờ chúng ta hãy chạy seeder:

php artisan db:seed --class=CreateUsersSeeder

Cuối cùng mình sẽ chạy chương trình để kiểm tra code của mình đã chạy hay chưa nhé.
Screen Login:

Admin User

Email: [email protected]
Password: 123456

Output:

Normal User

Email: [email protected]
Password: 123456

Output:

Hy vọng bài viết này giúp ích cho các bạn!

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 đầ