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中編寫我們的策略方法
<?phpnamespace 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.
開發中,可能我們要根據使用者的權限來判斷是否顯示一些按鈕,例如檢視中的編輯或者修改的按鈕,在blade中我們可以使用@can 來指定模型按鈕是否顯示
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中編寫我們的策略方法
<?phpnamespace 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.
開發中,可能我們要根據使用者的權限來判斷是否顯示一些按鈕,例如檢視中的編輯或是修改後的按鈕,在blade中我們可以使用@can 來指定模型按鈕是否顯示。
以上是Laravel中policy完成使用者授權方法實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!