搜尋

首頁  >  問答  >  主體

求一個關於laravel policy實際運用的完整程式碼

大家好,我在學習laravel policy的過程中卡住了,我知道laravel policy和middleware的區別,但是還不知道具體如何應用policy,版主可以給完整一個小程序過來嗎,非常感謝,
這是我在stackoverflow那裡找到的關於policy的形象解答,http://stackoverflow.com/ques...

然後這是我自己練手時在github上儲存的程式碼,如果哪位仁兄仁妹肯在我的程式碼中加入policy功能進去的話,不勝感激。隨便你用policy做任何功能都可以,只要增加了policy進去就可以了
https://github.com/GoogleYY/s...

黄舟黄舟2778 天前495

全部回覆(2)我來回復

  • PHP中文网

    PHP中文网2017-05-16 16:50:50

    PolicyGate结合起来使用就行,不复杂。Policy的注册在AuthServiceProvider里,如注册一个AccountPolicy::class => Account::class,就表示当前User是否有权限对Account这个Model進行增刪改查。

    AccountPolicy针对增删改查操作写上授权逻辑,如针对Delete操作写上$user->id === $account->user_id授權邏輯。

    如何觸發這個授權邏輯呢?可以使用Model Event触发,如在EventServiceProvider::boot()

    Event::listen('eloquent.deleting: *', function (Model $model) {
        if(Gate::denies('delete', $object)) {
            throw new ForbiddenHttpException("You donot have permission delete {get_class($model)}.");
        }
    })

    Gate与Policy的关系类似于Route与Controller的关系。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-05-16 16:50:50

    經過國外stackoverflow大神Amit Gupta的郵件幫助,現在解決了。
    第一步:先註冊policy,在Providers資料夾下的AuthServiceProvider.php裡建立Model與policy之間的連接關係,如下:

    protected $policies = [
            \App\Models\Role::class => \App\Policies\RolePolicy::class,
            \App\Models\Permission::class => \App\Policies\PermissionPolicy::class,
        ];

    第二步,透過php artisan make:policy 指令分別新建PermissionPolicy,並且把相關權限操控透過函數的方式寫進這兩個policy下面,如下所示:

    class PermissionPolicy
    {
    public function before($user, $ability) {
            if ($user->hasRole('admin')) {
                return true;
            }
        }
        
    public function create(\App\Models\User $user, \App\Models\Permission $permission)
        {
            return $user->hasPermission('permission.create');
        }
    }

    最後一步是在控制器裡使用這個policy設定的相關功能,如下:

    class PermissionController extends Controller {
        public function create() {
            $this->authorize('create', new \App\Models\Permission);
            return view('permissions.create');
        }
    }

    回覆
    0
  • 取消回覆