後台權限由環境變數決定:正式環境一律擋,本機一律放行。
後台開發最煩的事,是每次 migrate:fresh 之後,都要先去建一個帳號、登入、給權限,才能看到你正在做的那個頁面。
我的做法是讓權限跟著環境走:
// 後台一律要求登入與 admin 權限;只有 local / dev / testing 例外,方便本機開發與測試。
$middleware = app()->environment(['local', 'dev', 'testing'])
? []
: ['auth', 'can:admin'];
Route::prefix('admin')->name('admin.')->middleware($middleware)->group(...);
本機打開 /admin 就直接進去。正式環境沒有登入、沒有 admin 權限,一律擋。
一、deny-by-default。 注意那個三元運算的寫法——「擋」是預設值,「放行」是例外。 不是「如果是正式環境就加上驗證」,而是「除非是那三個環境,否則一律驗證」。未來多出一個 staging 環境,它會自動落在「擋」那一邊。這個方向不能寫反。
二、只有一個地方決定。 全站的後台路由共用這一段,不是每個 controller 各自判斷。要稽核的時候,只有一行要看。
三、用環境變數判斷,不要用別的。 我看過有人用網域判斷、用 branch 名稱判斷、甚至用 if ($_SERVER['HTTP_HOST'] === 'localhost')。那些都會在某天出錯。APP_ENV 是唯一一個部署時一定會被正確設定的東西。
這招有一個前提必須講清楚:dev 是會被放行的。
如果你的 dev 站台開在公網上、網址又好猜,那等於後台沒鎖。所以 dev 環境至少要有一道外層保護——基本認證(Basic Auth)、IP 白名單、或是放在 VPN 後面。
這是「開發便利」跟「安全」之間的交換,你要知道自己換了什麼。 我的判斷是:dev 站的資料都是假的,用一道 Basic Auth 擋住就夠了,換來的是每天開發的順暢。
但 production 永遠不在那個清單裡,這點沒有商量餘地。
同樣的手法我也用在 /_poc/* 那批路由上——只在 local / dev / testing 註冊,正式環境連路由都不存在。