Skip to main content
本文根據原始碼調查(1.x 分支)整理。目前尚無官方文件,仍為正式發佈前的套件(2026 年 4 月時點)。

什麼是 Sentinel

Laravel Sentinel 是以 driver 為基礎控制路由存取的安全 middleware 套件。由 Taylor Otwell 與 Mior Muhammad Zaki 開發,支援 PHP ^8.0 / Laravel 8〜13。 主要用途是保護 Telescope、Horizon、Pulse 等管理工具路由。只要對路由套用 SentinelMiddleware,就能依 driver 定義的授權邏輯來控制存取。

與傳統方式的比較

Telescope 與 Horizon 各有以 gate 為基礎的授權機制。
此方式依賴使用者的認證狀態,有「沒登入就無法判定」的問題。Sentinel 作為 middleware 運作,不論是否已認證都能以請求為單位控制存取,並可為多個管理工具在同一處定義規則。

安裝

由於 composer.jsonextra.laravel.providers 已註冊 SentinelServiceProvider,Service Provider 會被自動偵測。也不必發佈額外設定檔。

套件架構

預設 driver(Laravel driver)的行為

預設的 Laravel driver 只在本機環境(APP_ENV=local)下才進行控制。
整理流程如下:
Laravel driver 在 local 以外環境一律回傳 true(允許)。正式環境需要存取控制時請自訂 driver。

私人 IP 判斷

Driver 基底類別的 isPrivateIp() 使用 Symfony 的 IpUtils 判斷以下 IP 範圍為私人 IP:

Docker 本機環境偵測

REMOTE_ADDR127.0.0.1 且專案根目錄存在 .dockerenv 時,判斷為 Docker 本機環境。

作為 middleware 使用

基本用法

指定 driver

可將 driver 名稱作為 middleware 引數。若指定不存在的 driver 會回退到預設 driver(driverOrFallback() 的行為)。

middleware 實作

authorize() 回傳 false 時以 HTTP 401 中止。使用 Driver::authorizeOrFail() 也能拋出 AuthorizationException(middleware 本身未使用)。

建立自訂 driver

繼承 Driver 抽象類別並實作 authorize() 方法就能建立自訂 driver。
extend() 的註冊可放在 AppServiceProvider::boot() 等。

活用基底類別的 utility 方法

Driver 類別備有 IP 判斷等便利方法,可從自訂 driver 自由呼叫。

SentinelManager 機制

SentinelManager 繼承 Illuminate\Support\ManagerManager 是實作 driver pattern 的 Laravel 基礎類別,以 driver() 快取並解析 driver 實例。
driverOrFallback() 即使找不到指定 driver 也會安靜地回退到預設 driver,因此把不存在的 driver 名稱傳給 middleware 引數也不會出錯。 SentinelManagerSentinelServiceProvider 註冊為 scoped singleton(scoped),因此在同一請求內 driver 實例會被重用。

總結

laravel/sentinel 雖小,但透過使用 Illuminate\Support\Manager 的 driver pattern 具高擴充性。 預設 Laravel driver 專注於防止本機開發時 tunnel 服務的存取,正式環境的保護需要自行實作自訂 driver。等官方文件完備後,會有更具體的使用模式。

laravel/sentinel 儲存庫

原始碼與最新變更可在 GitHub 的 1.x 分支確認。
最後修改於 2026年8月2日