Laravel使用policy完成用戶授權
阿新 • • 發佈:2017-08-22
包含 mode 授權 顯示 make max 存在 term stp
Laravel 提供了一種更簡單的方式來處理用戶授權動作。類似用戶認證,Laravel 有 2 種主要方式來實現用戶授權:gates 和策略(policy)。
這裏記錄一下Policy的用法,使用Policy完成用戶授權主要包含三個步驟:
- 定義策略類
- 註冊策略類和模型關聯
- 策略判斷
定義策略類
策略是在特定模型或者資源中組織授權邏輯的類。例如,如果應用是一個博客,會有一個 Post
模型和一個相應的 PostPolicy
來授權用戶動作,比如創建或者更新博客或者刪除博客。
此時可以使用artisan 命令創建策略類,以下的命令創建了一個空的Post的策略類
php artisan make:policy PostPolicy
生成的策略將放置在 app/Policies
目錄。如果在你的應用中不存在這個目錄,那麽 Laravel 會自動創建
如果想要生成一個包含CURD的策略類,可以使用以下artisan命令
php artisan make:policy PostPolicy --model=Post
註冊策略類和模型關聯
在AuthServiceProvider中註冊策略類
protected $policies = [ //‘App\Model‘ => ‘App\Policies\ModelPolicy‘, 這個是laravel中默認註冊了的policy,可以模仿這個註冊我們自己的policy‘App\Post‘ => ‘App\Policies\PostPolicy‘, //註冊Post的policy ];
策略類和模型關聯即是在policy中編寫我們的策略方法
<?php namespace App\Policies; use App\User; use App\Post; use Illuminate\Auth\Access\HandlesAuthorization; class PostPolicy { use HandlesAuthorization; /** * Determine whether the user can update the post. * * @param \App\User $user * @param \App\Post $post * @return mixed*/ public function update(User $user, Post $post) { // return $user->id === $post->user_id; } /** * Determine whether the user can delete the post. * * @param \App\User $user * @param \App\Post $post * @return mixed */ public function delete(User $user, Post $post) { // return $user->id === $post->user_id; }
update
方法接受 User
和 Post
實例作為參數,並且應當返回 true
或 false
來指明用戶是否授權更新給定的 Post
。因此,這個例子中,我們判斷用戶的 id 是否和 post 中的 user_id
匹配,
策略判斷
這裏我們在控制器裏面使用控制器輔助函數來進行策略判斷
//文章編輯邏輯 public function update(Post $post) { $this->validate(request(),[ ‘title‘ => ‘required|String|min:5|max:50‘, ‘content‘ => ‘required|String|min:10‘, ]); $this->authorize(‘update‘,$post); ////////////////////策略判斷 $post->title = request(‘title‘); $post->content = request(‘content‘); $post->save(); return redirect("/posts/{$post->id}"); } //文章刪除 public function delete(Post $post) { //TODO::權限驗證 $this->authorize(‘delete‘,$post); //////////////////策略判斷 $post->delete(); return redirect(‘/posts‘); }
只要驗證不通過,laravel會自動拋出一個HttpException This action is unauthorized.
開發中,可能我們要根據用戶的權限來判斷是否顯示一些按鈕,比如視圖中的編輯或者是修改的按鈕,[email protected] 來指定模型按鈕是否顯示
Laravel使用policy完成用戶授權