spatie / laravel-permissions - Gate и hasPermissionTo не работают - PullRequest
0 голосов
/ 25 сентября 2019

У меня проблема с spatie/laravel-permissions ...

Я использую Gate в AuthServiceProvider.php для определения Superadmin (могу обойти все разрешения без регистрации в роли) ...

Отлично работает с can('the-permission') помощником.

Но не работает с Auth::user()->hasPermissionTo('the-permission') ...

.

.

Ниже мой код:

.

In AuthServiceProvider.php:

public function boot()
{
    $this->registerPolicies();

    Gate::before(function ($user, $ability) {
        $superadmin_rolename = 'Superadmin';
        $guard_name = 'web-admin';
        return $user->hasRole($superadmin_rolename , $guard_name ) ? true : null;
    });
}

.

.

InКлинок:

@can('add products')
    <button type="submit">Add Product</button>
@endcan

// this will work perfectly, the button will be shown

.

.

В контроллере:

public function addProduct()
{
    $admin = Auth::guard('web-admin')->user();

    if($admin->hasPermissionTo('add products')) return true;

    return false;
}

// this is not working (it return false)... i dont know why.... it should return true....

так, как я вам покажу выше:

  • Я использую Gate для определения superadmin
  • superadmin должен предоставить полный доступ
  • он отлично работает с can() и $user->can()
  • но он не работает с $user->hasPermissionTo() <--------- это то, что я хочу знать </li>

Спасибо

1 Ответ

0 голосов
/ 25 сентября 2019

Основываясь на комментарии @ Remul, я обнаружил, что только can() или $user->can() будут отлично работать с Gate::before ....

Итак, как, если я хочу использовать другой метод, такой как * 1006?* или $user->hasAllPermissions?

.

Это то, что я делаю ... Я решил создать собственный метод в Admin модели ..

<?php

namespace Model;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class Admin extends Authenticatable
{
    use HasRoles;

    protected $guard_name = "web-admin";

    protected $fillable = ['name', 'email', 'password'];

    public function canAny(array $permissions)
    {
        foreach($permissions as $e){
            if($this->can($e)) return true;
        }

        return false;
    }

    public function canAll(array $permissions)
    {
        foreach($permissions as $e){
            if(!$this->can($e)) return false;
        }

        return true;
    }
}
...