Thông thường trong Laravel ta hay sử dụng Authentication để sử dụng các tính năng như(Login, Register,..). Đồng thời cũng dùng để kiểm tra người dùng có Auth chưa bằng Auth:check()
Ta hay sử dụng Auth::check() trong Controller , nhưng để cho linh hoạt , linh động trong các Route. Ta có thể sử dụng Middleware để làm việc này
Hãy tạo một Middleware như sau:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Auth;
class CheckActive
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next, $guard = null): Response
{
$user = Auth::guard($guard)->user();
if ($user && $user->active == 1) {
return $next($request);
}
return abort(404, "Tài khoản không có quyền truy cập.");
}
}
Đoạn code Middleware trên dùng để kiểm tra người dùng đăng nhập bằng Guard nào (web, api,...)
Để dụng được Middleware trên bạn hãy nhớ kernel.php, Hiện tại mình dùng Laravel 10, nên mình chình vào app/Http/kernel.php cấu hình nó như sau:
protected $middlewareAliases = [
...
'check.active' => \App\Http\Middleware\CheckActive::class,
];
Vậy là mọi thứ chúng ta setup middleware xong, còn lại chỉ việc dùng nó trong Route thôi
Route::middleware(['check.active:web'])->group(function () {
// Các route yêu cầu user web phải active
});
Route::middleware(['check.active:api'])->group(function () {
// Các route yêu cầu user API phải active
});
Mọi người xem code Route xử lý trên, chổ "check.active:web" và "check.active:api" là mình gọi tới Middleware , kèm theo chỉ định Guard cho nó "web hoặc api" để nhận biết trong Middleware Auth::guard($guard)