首頁  >  文章  >  web前端  >  Laravel中policy完成使用者授權方法實例

Laravel中policy完成使用者授權方法實例

小云云
小云云原創
2018-03-13 14:47:462301瀏覽

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(),[            &#39;title&#39;      => &#39;required|String|min:5|max:50&#39;,            &#39;content&#39;    => &#39;required|String|min:10&#39;,
        ]);
        $this->authorize(&#39;update&#39;,$post);         ////////////////////策略判断
        $post->title = request(&#39;title&#39;);
        $post->content = request(&#39;content&#39;);
        $post->save();        return redirect("/posts/{$post->id}");
    }    //文章删除
    public function delete(Post $post)
    {        //TODO::权限验证
        $this->authorize(&#39;delete&#39;,$post);           //////////////////策略判断
        $post->delete();        return redirect(&#39;/posts&#39;);
    }

只要驗證不通過,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 = [        //&#39;App\Model&#39; => &#39;App\Policies\ModelPolicy&#39;,  这个是laravel中默认注册了的policy,可以模仿这个注册我们自己的policy        &#39;App\Post&#39; => &#39;App\Policies\PostPolicy&#39;, //注册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(),[            &#39;title&#39;      => &#39;required|String|min:5|max:50&#39;,            &#39;content&#39;    => &#39;required|String|min:10&#39;,
        ]);
        $this->authorize(&#39;update&#39;,$post);         ////////////////////策略判断
        $post->title = request(&#39;title&#39;);
        $post->content = request(&#39;content&#39;);
        $post->save();        return redirect("/posts/{$post->id}");
    }    //文章删除
    public function delete(Post $post)
    {        //TODO::权限验证
        $this->authorize(&#39;delete&#39;,$post);           //////////////////策略判断
        $post->delete();        return redirect(&#39;/posts&#39;);
    }

只要驗證不通過,laravel會自動拋出一個HttpException    This action is unauthorized.

開發中,可能我們要根據使用者的權限來判斷是否顯示一些按鈕,例如檢視中的編輯或是修改後的按鈕,在blade中我們可以使用@can 來指定模型按鈕是否顯示。

以上是Laravel中policy完成使用者授權方法實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn