Gate 不允许用户,而他已经拥有该权限

Gate not allows user while he has already that permission

我正在与 Laravel 8.5 合作,我想开发自己的 ACL。

所以我在权限和用户模型之间建立了这种 ManyToMany 关系:

User.php:

public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }

Permission.php:

public function users()
    {
        return $this->belongsToMany(User::class);
    }

然后我将此自定义权限插入 permissions table:

然后也将其插入主元 table pemrission_user:

然后在 web.php,我尝试了这个:

Route::get('/', function () {
    $user = auth()->user();
    // dd($user->permissions()->get());
    if(Gate::allows('edit-user')){
        dd(2);
    }else{
        dd(1);
    }
});

所以我尝试检查登录用户是否具有权限 edit-user,然后显示 2 作为结果,但现在它 returns 1不知何故,意味着用户没有这个权限!

但是,如果我取消注释 dd($user->permissions()->get());,我会看到:

所以它显示用户已经拥有此 edit-user 权限,但我不明白为什么在这种情况下 Gate 不授权用户。

所以如果你知道,我求求你帮助我,因为我真的不知道如何解决这个...

您还需要为您的 Gate 定义 edit-user,因为目前您的权限模型对 Gate 没有任何意义。

Gate::define('edit-user', function (User $user) {
    return $user->permissions()->whereName('edit-user')->exists();
});

可在此处找到更多信息:https://laravel.com/docs/8.x/authorization#writing-gates


否则,您可以使用策略:

class UserPolicy
{
    public function update(User $user)
    {
        return $user->permissions()->whereName('edit-user')->exists();
    }
}

然后允许用户:

$user->can('update', User::make());

可在此处找到有关政策的更多信息:https://laravel.com/docs/master/authorization#creating-policies


还有一个名为 laravel-permission 的开源软件包,由 Spatie 制作,您可以查看以了解更多信息。