#### 創建策略
通過命令行創建策略,創建的策略在app/policies文件夾下.
~~~
php artisan make:policy UserPolicy
~~~
我們定義一個方法,用于用戶更新時的權限驗證.
~~~
public function update(User $currentUser, User $user)
{
return $currentUser->id === $user->id;
}
~~~
update 方法接收兩個參數,第一個參數默認為當前登錄用戶實例,第二個參數則為要進行授權的用戶實例。當兩個 id 相同時,則代表兩個用戶是相同用戶,用戶通過授權,可以接著進行下一個操作。如果 id 不相同的話,將拋出 403 異常信息來拒絕訪問。
使用授權策略需要注意以下兩點:
1. 我們并不需要檢查 $currentUser 是不是 NULL。未登錄用戶,框架會自動為其 所有權限 返回 false.
2. 調用時,默認情況下,我們 不需要 傳遞當前登錄用戶至該方法內,因為框架會自動加載當前登錄用戶(接著看下去,后面有例子).
接下來我們還需要在 AuthServiceProvider 類中對授權策略進行設置。AuthServiceProvider 包含了一個 policies 屬性,該屬性用于將各種模型對應到管理它們的授權策略上。我們需要為用戶模型 User 指定授權策略 UserPolicy。
在app/Providers/AuthServiceProvider.php文件中注冊策略.
~~~
protected $policies = [
\App\Models\User::class => \App\Policies\UserPolicy::class, //策略所應用的模型
];
~~~
授權策略定義完成之后,我們便可以通過在用戶控制器中使用 authorize 方法來驗證用戶授權策略。默認的 App\Http\Controllers\Controller 類包含了 Laravel 的 AuthorizesRequests trait。此 trait 提供了 authorize 方法,它可以被用于快速授權一個指定的行為,當無權限運行該行為時會拋出 HttpException。authorize 方法接收兩個參數,第一個為授權策略的名稱,第二個為進行授權驗證的數據。
~~~
$this->authorize('update', $user);
~~~
這里 update 是指授權類里的 update 授權方法,$user 對應傳參 update 授權方法的第二個參數。正如上面定義 update 授權方法時候提起的,調用時,默認情況下,我們 不需要 傳遞第一個參數,也就是當前登錄用戶至該方法內,因為框架會自動加載當前登錄用戶。
## 再舉例一個策略的場景
管理員可以對普通用戶進行刪除,但是管理員不能刪除自己.
~~~
class UserPolicy
{
use HandlesAuthorization;
public function destroy(User $currentUser, User $user)
{
return $currentUser->is_admin && $currentUser->id !== $user->id;
}
}
~~~