首頁  >  文章  >  後端開發  >  Laravel 權限控制 Gate Policy

Laravel 權限控制 Gate Policy

不言
不言原創
2018-06-05 09:46:042099瀏覽

這篇文章主要介紹了關於Laravel 權限控制Gate Policy,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

##關於權限

本質針對一段可執行的邏輯單元描述是否開啟生產的判斷。

定義 必定有一使用者實例或唯一識別參數,以及與之關聯的使用資源。通常使用閉包或函數或方法

使用 呼叫權限邏輯單元句柄,參數 權限操作對象,使用者資訊。

源起

最基本的權限控制,三元運算子 ? :。很顯然條件判斷,後面跳到對應的執行邏輯。

laravel的想法是將執行邏輯(生產程式碼),授權(條件判斷邏輯)分開。重點關注條件的產生,通俗講強化授權邏輯(這對複雜的授權十分有用)。公設:所有的代碼在服務註冊完畢後,啟動。所以下面這段程式碼會被註冊。其目的是找到真正授權判斷的邏輯體。

Gate::define('update articles', 'ArticlePolicy@update')

其中第一個參數顯然只是一個授權標識符(用來呼叫的句柄參數),第二個參數才為授權的邏輯執行體。


laravel授權定義

AuthServiceProviderboot 方法裡定義授權
#

Gate::define('update articles', function ($user, $article) {
    return $user->id == $article->user_id;
});

Gate::define('update articles', 'ArticlePolicy@edit');
<?php

namespace App\Policies;

use App\User;
use App\Models\Article;

class ArticlePolicy
{
    public function update(User $user, Article $article)
    {
        return $user->id == $article->author_id;
    }
}

laravel授權使用

  1. Gate 門面:

    Gate::allows('update articles', $article) Gate::denies('update articles', $article)

  2. Controller 引入了

    trait AuthorizesRequests

    $this->authorize('update articles', $article)

  3. Blade 模板:

    @can('update articles', $article)@cannot('update articles', $article)指令。

  4. User Model 實例:

    $user->can('update articles', $article)$user->cannot('update articles', $article)

Laravel Policy

#為了方便定義和使用授權,Laravel 在Gate的基礎上引入了 Policy。 policy內部的每一個方法,都會被用gate::define方法的描述註冊。所以這就是為什麼使用了策略類別註冊之後,即便沒有用Gate門面定義授權邏輯,在控制器內仍然可以使用Gate::allow('策略類別方法')的形式來進行授權判斷 。


AuthServiceProviderpolicies 陣列屬性裡先定義授權映射關係

/**
 * The policy mappings for the application.
 *
 * @var array
 */
protected $policies = [
    Article::class => ArticlePolicy::class,
];
<?php

namespace App\Policies;

use App\User;
use App\Models\Article;
use Illuminate\Auth\Access\HandlesAuthorization;

class ArticlePolicy
{
    use HandlesAuthorization;

    public function create(User $user)
    {
        return true;
    }

    public function delete(User $user, Article $article)
    {
        return $user->id == $article->author_id;
    }

     public function before($user, $ability)
    {
        if($user->isSuperAdmin()){
            return true;
        }
    }
 }

#注意

Policy 只是在普通PHP 類別基礎上新增了一個

HandlesAuthorization trait。

在 Policy 中會在所有方法執行前調用,常用到的地方就是處理管理員授權邏輯。


相關推薦:

Laravel利用gulp如何建構前端資源

以上是Laravel 權限控制 Gate Policy的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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