Middleware trong laravel là gì?

  • Trang chủ
  • Hướng dẫn học
  • Laravel
  • Middleware

  • Middleware cung cấp giải pháp lọc các điều kiện HTTP từ các request, như xác thực người dùng đăng nhập vào hệ thống.
  • Nếu người dùng chưa đăng nhập, Middleware sẽ chuyển hướng người dùng tới trang login, ngược lại, nếu người dùng đã đăng nhập, thì middleware sẽ cho phép request được thực hiện.
  • Laravel có cung cấp sẵn một số Middleware hữu ích: Middleware xác thực, CSRF protection,... Tất cả nằm tại thư mục /app/Http/Middleware/.
  • Chúng ta cũng có thể tạo Middleware với các điều kiện lọc tùy ý.

  • Giả sử ta đã tạo xong Authentication và đăng ký username với tên: [email protected]
  • Tiếp theo ta tạo một trang View Admin với đường dẫn sau: http://localhost:82/admin/index.php (Xem lại View nếu chưa biết cách tạo).
  • Giả sử trang Admin chỉ cho phép username đăng nhập mới được quyền xem thông tin trang, nếu chưa đăng nhập sẽ trả về trang login.
  • Để thực hiện các giả định trên, ta tiến hành như sau:
  • Tạo username từ trang đăng ký: http://localhost:82/register

Middleware trong laravel là gì?

  • Tạo một file views admin /resources/views/admin/index.blade.php, với nội dung sau:

<!doctype html> <html> <head> <meta charset="utf-8"> <title>Administrator</title> </head> <body> Đây là trang Admin </body> </html>

  • Tạo một Routing /routes/web.php để hiển thị views Admin này.

Route::get('/admin', function () { return view('admin/index'); });

  • Khi này chạy trình duyệt http://localhost:82/admin sẽ cho ta kết quả.
  • Để gán Middleware, nếu người dùng mở trang http://localhost:82/admin mà chưa đăng nhập sẽ trả về trang login, ngược lại, nếu đã đăng nhập thì sẽ xem được nội dung trang Admin, ta thay đổi nội dung Routing /routes/web.php như sau:

Route::get('/admin', function () { return view('admin/index'); })->middleware('auth');

  • Khi này nếu người dùng chưa đăng nhập, sẽ trả về trang login:

    Middleware trong laravel là gì?

  • Nếu người dùng đã đăng nhập, thì sẽ xem được nội dung trang Admin:

  • Ta sẽ tạo một Middleware với các điều kiện lọc riêng để kiểm tra: nếu đăng nhập bằng [email protected] thì sẽ cho xem nội dung, ngược lại nếu đăng nhập bằng username khác thì sẽ redirect trả về trang /home, nếu chưa đăng nhập thì trả về trang /login.
  • Trước tiên tạo file Middleware bằng cách mở cửa sổ lệnh cmd, di chuyển tới thư mục myproject bằng lệnh:

cd C:\xampp\htdocs\myproject\

Middleware trong laravel là gì?

php artisan make:middleware CheckLogin

  • php artisan - Công cụ hỗ trợ viết command line tích hợp sẵn trong Laravel, sẽ còn gặp lại nhiều.
  • make:middleware - Lệnh tạo Middleware.
  • CheckLogin - Tên Middleware do mình tự đặt.

Dòng lệnh trên thực thi sẽ cho ta kết quả sau:

Middleware trong laravel là gì?

  • Sau khi thực thi lệnh, chúng ta sẽ nhận được thông báo file Middleware đã được tạo "Middleware created successfully.".
  • File Middleware CheckLogin.php vừa tạo sẽ được lưu tại thư mục /app/Http/Middleware/, có nội dung như sau:

<?php namespace App\Http\Middleware; use Closure; class CheckLogin { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { return $next($request); } }

  • Việc chúng ta cần quan tâm là nội dung bên trong function handle.
  • Viết lại function handle trên, với điều kiện xử lý việc đăng nhập:

<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; class CheckLogin { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if (Auth::check()&&Auth::user()->email == "[email protected]") { return $next($request); } else { return redirect("/home"); } } }

  • use Illuminate\Support\Facades\Auth; Khai báo sử dụng Facades Auth.
  • Nhìn vào câu điều kiện If bên trên, nếu thỏa mãn điều kiện sau thì yêu cầu sẽ được thực thi tiếp (Khi này Routing sẽ làm việc và yêu cầu sẽ trả về trang admin):

  • Ngược lại nếu không thỏa mãn điều kiện trên, sẽ redirect trả kết quả về trang /home.
  • Để Middleware hoạt động, ta cần khai báo Middleware vào /app/Http/Kernel.php

protected $routeMiddleware = [ 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'checklogin' => \App\Http\Middleware\CheckLogin::class, ];

  • checklogin: tên sẽ được sử dụng.
  • \App\Http\Middleware\CheckLogin: đường dẫn tới file CheckLogin.
  • Khi này ta có thể sử dụng được Middleware CheckLogin vừa tạo.
  • Chúng ta sẽ tiến hành sử dụng Middleware CheckLogin vừa tạo bằng cách viết trong file Routing /routes/web.php:

Route::get('/admin', function () { return view('admin/index'); })->middleware('checklogin::class');

  • Chú ý là tên checklogin sẽ trùng với trên khai báo trong Kernel.php
  • Tới đây ta đã tạo và khai báo sử dụng Middleware CheckLogin thành công, test bằng cách tạo nhiều user khác nhau tại trang http://localhost:82/register, trong đó có một user có email đăng nhập là [email protected], sau đó lần lượt login và chạy trang http://localhost:82/admin để xem kết quả:

    • Nếu login bằng [email protected], và mở trang http://localhost:82/admin, thì sẽ thấy nội dung:

    • Nếu login bằng username với email khác, và mở trang http://localhost:82/admin, thì kết quả sẽ trả về trang /home

      Middleware trong laravel là gì?

    • Nếu chưa login, và mở trang http://localhost:82/admin, thì kết quả sẽ trả về trang /login

      Middleware trong laravel là gì?

Middleware là một trong những kiến thức không thể thiếu khi tìm hiểu về Laravel. Nó đóng vai trò xác thực người dùng đăng nhập vào hệ thống. Chẳng hạn chỉ Admin mới có quyền truy cập vào khu vực quản trị Admin đăng bài viết hay sửa xóa một cái gì đó.

Cách thức hoạt động của Middleware trong Laravel

Bộ lọc trung gian sẽ nằm giữa các request và phản hồi (response). Middleware sẽ nằm trong thư mục app/Http/Middleware. Để hiểu rõ hơn bạn hãy thực hành ví dụ sau: Bước 1: Tạo một tập tin là VerifyIfAdmin.php (Tại app/Http/Middleware)

<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; class VerifyIfAdmin { public function handle($request, Closure $next, $guard = null) { if (Auth::guard($guard)->check()) {            return redirect('admin-dashboard');        } return $next($request); } }

Bước 2: Thêm dòng lệnh này vào trong tập tin Kernel.php (Tại app/Http) ‘admin’ là tên do bạn đặt.

'admin' => \App\Http\Middleware\VerifyIfAdmin::class,

Bước 3: Tạo một tập tin là AdminController.php (Tại app\Http\Controllers)

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class AdminController extends Controller { public function index(){ return view('login'); } } ?>

Bước 4: Định tuyến routes bằng lệnh dưới trong file web.php

Route::get('test', 'App\Http\Controllers\[email protected]')->middleware('admin'); Hoặc: Route::group(['middleware' => 'admin'], function () { Route::get('test', 'App\Http\Controllers\[email protected]')->name('test'); });

Đọc thêm: Route trong Laravel 8

Bước 5: Tạo file login.blade.php tại views

<form>Form để đăng nhập</form>

Bước 6: Truy cập đường dẫn http://localhost/quachquynh/public/login để kiểm tra.

Trường hợp bạn đã đăng nhập rồi thì nó sẽ được chuyển hướng tới route admin-dashboard. Còn ngược lại sẽ chuyển hướng về trang đăng nhập.

Đọc thêm:

Category:
Tags: Học Laravel Framework 8