Laravel: Bảo mật Website của bạn với Middleware

Middleware cung cấp một giải pháp khá tiện ích cho việc filtering HTTP các requests vào ứng dụng. Ví dụ, Laravel có chứa một middleware xác thực người dùng đăng nhập vào hệ thống. Nếu user chưa đăng nhập, middleware sẽ chuyển hướng user tới màn hình đăng nhập. Tuy nhiên, nếu user đã đăng nhập rồi, thì middleware sẽ cho phép request được thực hiện tiếp tiến trình xử lý vào ứng dụng.

Tất nhiên, bạn có thể viết thêm middleware để thực hiện nhiều tác vụ nữa ngoài kiểm tra đăng nhập vào hệ thống. Một CORS middleware có trách nhiệm cho việc thêm các header hợp lý vào trong tất cả các response gửi ra ngoài. Một logging middleware có thể ghi log cho tất cả các request tới ứng dụng.

Có vài middleware đã có sẵn trong Laravel framework, bao gồm middlware xác thực, CSRF protection. Tất cả được nằm trong thư mục app/Http/Middleware.

Tạo Middleware

Để tạo mới một middleware, sử dụng lệnh make:middleware Artisan:

php

artisan make:middleware CheckAge

Câu lệnh này sẽ tạo ra class CheckAge bên trong thư mục app/Http/Middleware. Trong middleware này, chúng ta chỉ cho phép truy cập vào route nếu giá trị age lớn hơn 200. Ngược lại, chúng ta sẽ chuyển hướng request lại trang home URI.

<?php

namespace

App

\

Http

\

Middleware

;

use

Closure

;

class

CheckAge

{

public

function

handle

(

$request

, Closure

$next

) {

if

(

$request

->age <=

200

) {

return

redirect(

'home'

); }

return

$next

(

$request

); } }

Như bạn thấy, nếu biến age nhỏ hơn hoặc bằng 200, middleware sẽ trả về một HTTP tới client; ngược lại, request sẽ được gửi tiếp để xử lý. Để truyền request vào sâu hơn trong ứng dụng (cho phép middleware “vượt qua”), đơn giản chỉ cần gọi callback $next với $request.

Tốt nhất hãy hình dung như là một chuỗi các “lớp” trên HTTP requests cần phải đi qua trước khi nó vào ứng dụng. Mỗi lớp sẽ được kiểm tra request và thậm chí có thể hủy từ chối request hoàn toàn.

Trước & Sau Middleware

Việc middleware chạy trước hay chạy sau một request phụ thuộc vào chính nó. Ví dụ, middleware dưới đây sẽ làm một vào tác vụ trước khi request được chương trình xử lý:

<?php

namespace

App

\

Http

\

Middleware

;

use

Closure

;

class

BeforeMiddleware

{

public

function

handle

(

$request

, Closure

$next

) {

return

$next

(

$request

); } }

Tất nhiên, middleware này sẽ thực hiện việc của nó sau khi request được xử lý bởi ứng dụng:

<?php

namespace

App

\

Http

\

Middleware

;

use

Closure

;

class

AfterMiddleware

{

public

function

handle

(

$request

, Closure

$next

) {

$response

=

$next

(

$request

);

return

$response

; } }