技術 5 分鐘閱讀

深入理解 Laravel Middleware:從認證到 Rate Limiting

深入理解 Laravel Middleware:從認證到 Rate Limiting

什麼是 Middleware?

Middleware 就像是 HTTP 請求的守門員。每一個進到你應用程式的請求,都會先經過 Middleware 的檢查。常見的用途包括認證、日誌記錄、CORS 設定等。

建立自訂 Middleware

php artisan make:middleware EnsureApiKeyIsValid
// app/Http/Middleware/EnsureApiKeyIsValid.php
class EnsureApiKeyIsValid
{
    public function handle(Request $request, Closure $next): Response
    {
        if ($request->header('X-API-Key') !== config('services.api_key')) {
            return response()->json([
                'error' => 'Invalid API key',
            ], 401);
        }

        return $next($request);
    }
}

註冊 Middleware

全域 Middleware

每個請求都會執行:

// bootstrap/app.php (Laravel 11+)
->withMiddleware(function (Middleware $middleware) {
    $middleware->append(LogRequestMiddleware::class);
})

路由 Middleware

只在特定路由生效:

Route::middleware(['auth', 'verified'])->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
});

常見應用場景

1. 認證檢查

Laravel 內建的 auth Middleware 是最常用的:

Route::middleware('auth:sanctum')->group(function () {
    Route::get('/user', function (Request $request) {
        return $request->user();
    });
});

2. Rate Limiting

防止 API 被濫用:

// bootstrap/app.php
RateLimiter::for('api', function (Request $request) {
    return Limit::perMinute(60)->by(
        $request->user()?->id ?: $request->ip()
    );
});

3. CORS 設定

// config/cors.php
return [
    'paths' => ['api/*'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['https://yourfrontend.com'],
    'allowed_headers' => ['*'],
    'max_age' => 86400,
];

4. 語言切換

class SetLocale
{
    public function handle(Request $request, Closure $next): Response
    {
        $locale = $request->header('Accept-Language', 'zh-TW');
        app()->setLocale($locale);

        return $next($request);
    }
}

5. 回應加入自訂 Header

Middleware 不只能處理「請求」,也能修改「回應」:

class AddSecurityHeaders
{
    public function handle(Request $request, Closure $next): Response
    {
        $response = $next($request);

        $response->headers->set('X-Content-Type-Options', 'nosniff');
        $response->headers->set('X-Frame-Options', 'DENY');
        $response->headers->set('X-XSS-Protection', '1; mode=block');

        return $response;
    }
}

Middleware 的執行順序

Middleware 像洋蔥一樣層層包裹。請求從外到內通過每個 Middleware,回應則從內到外。理解這個順序很重要,特別是在做 API 設計 時。

搭配測試

public function test_unauthenticated_user_gets_redirected()
{
    $response = $this->get('/dashboard');
    $response->assertRedirect('/login');
}

public function test_rate_limiting()
{
    for ($i = 0; $i < 61; $i++) {
        $response = $this->getJson('/api/products');
    }
    $response->assertStatus(429);
}

小結

Middleware 是 Laravel 中非常強大的功能,善用它可以讓你的程式碼更乾淨、更有組織。把橫切關注點抽到 Middleware 裡,Controller 就能專注在業務邏輯上。搭配 Docker 環境做好開發環境設定,整體開發體驗會更順暢。

如果你需要類似的系統,歡迎聯繫討論。

#Laravel #Middleware
Thousand Lab

Thousand Lab