Laravel 在 middleware 裡如何取得目前登入帳號的資訊

在 session-based(如 web guard)驗證流程中取得的方法

在 Laravel 的 middleware 中,你可以透過 Authrequest()->user() 取得目前登入的使用者資訊。這取決於你使用的是哪一種 guard(預設是 web)。以下是常見的寫法範例

方法 1:使用 Auth facade

use Closure;
use Illuminate\Support\Facades\Auth;

public function handle($request, Closure $next)
{
    $user = Auth::user(); // 取得目前登入的使用者

    // 範例:檢查是否為管理者
    if ($user && $user->is_admin) {
        return $next($request);
    }

    abort(403, 'Unauthorized');
}

方法 2:從 $request 取得使用者

public function handle($request, Closure $next)
{
    $user = $request->user(); // 同樣取得登入使用者

    // 範例:記錄使用者 ID
    \Log::info('Middleware 使用者ID:' . optional($user)->id);

    return $next($request);
}

如果使用自訂 guard

若你有定義多個 guard,例如 adminapi,則需指定 guard:

$user = Auth::guard('admin')->user();

檢查是否已登入

if (Auth::check()) {
    $user = Auth::user();
}

小提醒:

  • Auth::user() 只有在 session-based(如 web guard)驗證流程下才會有作用。
  • 如果你在 middleware 非同步請求(如 API token)中使用,請確認 guard 是正確的,或使用 Passport/Sanctum。

Sanctum 做 API 認證的取得方法

如果你在 Laravel 中使用 Sanctum 做 API 認證,通常是透過 Bearer Token 登入。這種情況下,在 middleware 裡面取得登入使用者資料 的方式如下:

確認 Sanctum 正常運作條件

  • 前端請求要加上 Header:
  • 使用者必須透過 POST /login 或發 token 登入,取得 Bearer Token。
Authorization: Bearer {token}

使用 Auth::guard('sanctum')->user() 取得目前登入帳號資訊


    public function handle(Request $request, Closure $next): Response
    {
        $postId = $request->route('id') ?? $request->route('post'); // 支援不同路由命名

        $user = Auth::guard('sanctum')->user();
        $user_id = $user?->id;
        
        if (!$user) {
           return response()->json(['message' => 'Unauthenticated'], 401);
        }
        // 你可以使用 $user->id 或 $user->email 等資訊
        \Log::info('API 使用者 ID:' . $user->id);

        return $next($request);
    }

在 Sanctum 的情況下,Laravel 會自動綁定 sanctum 到預設 guard,所以直接用 $request->user() 就夠了,但無法取得目前登入帳號資訊,則可以嚐試用 Auth::guard('sanctum')->user() 取得。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


內容索引