spatie / laravel-permissions-Gate和hasPermissionTo不起作用

时间:2019-09-25 08:10:09

标签: laravel permissions spatie

我对spatie/laravel-permissions有问题...

我在Gate中使用AuthServiceProvider.php来定义Superadmin(可以绕过所有权限而无需将其注册到角色中)...

它可以与can('the-permission')助手一起很好地工作。

但是它不适用于Auth::user()->hasPermissionTo('the-permission') ...

下面是我的代码:

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;
    });
}

刀片中:

@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定义超级管理员
  • 超级管理员应授予所有访问权限
  • 它与can()$user->can()完美配合
  • 但它不能与$user->hasPermissionTo()一起使用<---------这就是我想知道的

谢谢

1 个答案:

答案 0 :(得分:1)

基于@Remul的评论,我发现只有can()$user->can()Gate::before才能完美搭配。...

那么,如果我想使用诸如$user->hasAnyPermission$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;
    }
}