1. 程式人生 > >Laravel使用policy完成用戶授權

Laravel使用policy完成用戶授權

包含 mode 授權 顯示 make max 存在 term stp

Laravel 提供了一種更簡單的方式來處理用戶授權動作。類似用戶認證,Laravel 有 2 種主要方式來實現用戶授權:gates 和策略(policy)。

這裏記錄一下Policy的用法,使用Policy完成用戶授權主要包含三個步驟:

  1. 定義策略類
  2. 註冊策略類和模型關聯
  3. 策略判斷

定義策略類

策略是在特定模型或者資源中組織授權邏輯的類。例如,如果應用是一個博客,會有一個 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 方法接受 UserPost 實例作為參數,並且應當返回 truefalse 來指明用戶是否授權更新給定的 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完成用戶授權