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