前言
自 Laravel 5.8 開始,Policy 有自動發現的功能,不需要另外註冊。
新增
新增 Policy 授權策略。
| 1 | php artisan make:policy RecordPolicy --model=Record | 
在 app/Policies 資料夾的 RecordPolicy.php 檔撰寫授權邏輯,第一個參數 $user 是當前登入的使用者實例。
| 1 | /** | 
方法
在控制器中使用 authorize() 方法,在驗證失敗後會自動導向 403 頁面。
| 1 | public function show(User $user, Record $record) | 
在不帶有模型實例的方法中使用時,需要將其模型類別帶入。
| 1 | public function store(User $user) | 
如果要手動帶入使用者實例,可以使用 authorizeForUser() 方法。
| 1 | public function show(User $user, Record $record) | 
授權資源
在控制器的建構子使用 authorizeResource() 方法,可以一次為所有方法套用授權策略。
| 1 | $this->authorizeResource(Record::class, 'record'); | 
此方法必須在各個類別方法中注入模型實例,如此 Policy 才能知道需要被處理的對象為何。
| 1 | public function show(Record $record) | 
自動發現
如果模型不是放在預設的資料夾,而是 App\Models 的話,需要修改 Policy 的自動發現方法。在 AppServiceProvider 服務提供者的 boot() 方法中加入以下:
| 1 | \Illuminate\Support\Facades\Gate::guessPolicyNamesUsing(function ($model) { | 
認證
在使用認證套件時,記得在路由定義認證中介層,例如 auth:api,如此當前登入的使用者實例才能被獲取。