Middleware

Middleware là gì?

  • 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 ý.

Sử dụng Middleware chặn quyền truy cập

  • 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ạo một auth

Tạo trang Admin

  • 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ả.
Đây là trang Admin
  • Để 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:

    Tạo một auth

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

    Đây là trang Admin

Tạo Middleware kiểm tra đăng nhập

  • 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\

Tạo một Middleware

TẠO MIDDLEWARE BẰNG LỆNH ARTISAN

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:

Tạo một Middleware

  • 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.

KHAI BÁO MIDDLEWARE VÀO ROUTING

  • Để 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.

SỬ DỤNG MIDDLEWARE

  • 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:

      Đây là trang Admin
    • 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

      Tạo một Middleware

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

      Tạo một Middleware