เป็นการกรอง HTTP requests ที่จะเข้ามาใน App ของเรา เช่น ตรวจสอบว่าหากเข้ามาหน้านี้ ต้องผ่านการล็อกอินก่อน หากยังไม่ได้ล็อกอินให้ redirect ไปยังหน้าล็อกอิน เป็นต้น
รันโค๊ดด้านล่าง
1 |
php artisan make:middleware CheckAge |
จากนั้นจะมีการสร้างไฟล์ ใว้ใน app/Http/Middleware จากนั้นก็เขียนโค๊ดเงื่อนไข Middleware ของเรา
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php namespace App\Http\Middleware; use Closure; class CheckAge { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ($request->age <= 200) { return redirect('home'); } return $next($request); } } |
ก่อนใช้งาน Middleware ต้องมีการลงทะเบียนก่อนในไฟล์ app/Http/Kernel.php
ทุกๆ HTTP reques จะผ่าน Middleware ในนี้ก่อน
สำหรับนำไปใช้กับ route โดยเราต้องกำหนด route เองว่าจะใช้ middleware ตัวไหน
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Within App\Http\Kernel Class... protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, ]; |
การนำไปใช้ใน route
1 2 3 |
Route::get('admin/profile', function () { // })->middleware('auth'); |
หรือใช้ middleware ได้พร้อมกันหลายตัว
1 2 3 |
Route::get('/', function () { // })->middleware('first', 'second'); |
หรือใช้
1 2 3 4 5 |
//USER SECTION ตรวจสอบการล็อกอินก่อน Route::middleware(['auth','ispermitted'])->group(function () { Route::get('/', 'HomeController@index')->name('home'); Route::get('/home', 'HomeController@index')->name('home'); }); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ 'throttle:60,1', 'auth:api', ], ]; |
การสร้าง middleware สำหรับตรวจสอบสิทธิ์ อิงตาม route ที่ส่งมา ซึ่งจะส่งค่าไปตรวจสอบอีกทีใน Method IsPermitted in app/User.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; class IsPermitted { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { // Method isAdmin in app/User.php if(Auth::user()->isAdmin()){ return $next($request); } //get rountname,action,id $requestname = $request->route()->getName(); $routeinfo = explode(".",$requestname); $routename = isset($routeinfo[0]) ? $routeinfo[0] : ''; $action = isset($routeinfo[1]) ? $routeinfo[1] : ''; //อิงจาก /departments/{department}/edit ซึ่งตอนผมกำหนด Route::resource('departments', 'DepartmentController'); ผมเติมตัว s เข้าไป ก็เลยต้องตัดออกเพื่อให้ค่า parameter มันถูกต้อง $parameter = substr($routename,0,strlen($routename)-1); $id = $request->$parameter; // // Method IsPermitted in app/User.php if ( Auth::check()&&Auth::user()->IsPermitted($routename,$action,$id)){ return $next($request); }else{ return redirect(route('not_have_permission')); } } } |
ใน route เรียกใช้ middleware
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Auth::routes(); //USER SECTION ตรวจสอบการล็อกอินก่อน Route::middleware(['auth','ispermitted'])->group(function () { //First Page Route::get('/', 'HomeController@index')->name('home'); Route::get('/home', 'HomeController@index')->name('home'); /*Resource Controller https://laravel.com/docs/master/controllers#basic-controllers*/ Route::resources([ 'users' => 'UserController', 'departments' => 'DepartmentController' ]); }); Route::get('/not_have_permission', function () { return view('errors.custom',['message'=>'You are not permitted to execute this Operation.']); })->name("not_have_permission"); // |
อ่านเพิ่มเติม
https://arnondora.in.th/middleware-laravel
https://benzneststudios.com/blog/laravel/how-to-use-middleware-laravel5/
https://laravel.com/docs/master/middleware#introduction
hasRole https://stackoverflow.com/questions/31790234/laravel-5-adding-hasrole-method-to-auth
ป้ายกำกับ:laravel, Middleware