02/11/2018, 15:29

Bảo mật 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, ...

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.

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

1.Tạo Middleware 

php artisan make:middleware mymiddleware (tên middleware)

Câu lệnh này sẽ tạo ra class mymiddleware trong mục app/Http/Middleware.Khi tạo xong sẽ được như thế này

<?php

namespace App\Http\Middleware;

use Closure;

class Mymiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
          return $next($request);
    }
}

Ví Dụ

<?php

namespace App\Http\Middleware;

use Closure;

class Mymiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->has('diem') && $request['diem'] > 7) {
          //Điều kiện phải có điểm và phải lớn hơn 7 thì mới được vào
          return $next($request);
        }else {
            return redirect()->route('loi');
        }
    }
}

2.Đăng ký Middleware

Global Middleware

Nếu bạn muốn một middleware có thể thực thi trong mọi HTTP request tới ứng dụng của bạn, đơn giản chỉ cần thêm tên class của middleware trong thuộc tính $middleware của class app/Http/Kernel.php

Gán Middleware vào Routes

Nếu bạn muốn gán middleware cho route cụ thể, đầu tiên bạn cần thêm middleware đấy vào trong file app/Http/Kernel.php Mặc định, thuộc tính $routeMiddleware sẽ chứa một số class thuộc middleware của framework Laravel. Để thêm middleware của bạn, đơn giản chỉ là thêm nó vào dach sách và gán từ khóa bạn chọn.

Ví dụ:

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,
    'mymiddleware' => \App\Http\Middleware\Mymiddleware::class
];

Khi middleware đã được định nghĩa trong HTTP kernel, bạn có thể sử dụng phương thức middleware cho một route:

Route::get(' / ' ,function(){

})->middleware('Tên middleware');

Ngoài ra bạn cũng có thể gán nhiều middleware cho một route:

Route::get(' / ',function(){

})->middleware('auth','mymiddleware');

Khi đã gán middleware, bạn cũng có thể sử dụng tên đầy đủ của middleware:

 

use App\Http\Middleware\Mymiddleware;

Route::get(' / ',function(){

})->middleware(Mymiddleware::class);

Nhóm Middleware

Thỉnh thoảng bạn muốn nhóm một vài middleware lại trong một khóa để thực hiện gán vào route dễ dàng hơn. Bạn có thể sử dụng thuộc tính $middlewareGroups của HTTP kernel.

Mặc định, Laravel cung cấp sắp 2 nhóm middleware web api chứa những middleware thường sử dụng mà bạn có thể muốn áp dụng cho web UI và API routes:

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',
    ],
];

Nhóm middleware được gán vào routes và controller sử dụng cú pháp tương tự như với từng middleware. Một lần nữa, nhóm middleware làm đơn giản trong việc gán các middleware vào trong một route:

 

Route::get('/ ',function(){

})->middleware('mymiddleware');

Route::group(['middleware' => ['mymiddleware']],function(){

});

 

Ví Dụ

- Tạo middleware vào tạo điều kiện

<?php

namespace App\Http\Middleware;

use Closure;

class Mymiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->has('diem') && $request['diem'] > 7) {
          //Điều kiện phải có điểm và phải lớn hơn 7 thì mới được vào
          return $next($request);
        }else {
            return redirect()->route('loi');
        }
    }
}

- Đăng ký middleware trong file 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,
    'mymiddleware' => \App\Http\Middleware\Mymiddleware::class
];

- Tạo route và gọi middleware mà mình đã tạo

        Route::get('/diem',function(){
		echo 'Bạn đã đủ điểm';
	})->middleware('mymiddlewear')->name('diem');

	Route::get('/loi',function(){
		echo 'Bạn không đủ điểm';
	})->name('loi');

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

- Tạo 1 blade nhập điểm

<form action="{{route('diem')}}" method="GET" role="form">
	<legend>Nhập điểm</legend>

	<div class="form-group">
		<label for="">Điểm</label>
		<input type="number" class="form-control" id="" placeholder="Input field" name="diem">
	</div>
	<button type="submit" class="btn btn-primary">Submit</button>
</form>

Kết quả nếu nhập điểm đủ điều kiện thì sẽ vào route('diem') nếu không thì sẽ vào route('loi')

+4