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