0

我想问一下 Laravel BackPack 权限管理器中的播种问题,

我正在尝试默认的 Backpack Permission Manager 配置,并尝试使用虚拟数据对其进行播种。

这是我的角色和权限播种器方法:

    public function run()
    {
        // Reset cached roles and permissions
        app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();

        // create permissions
        Permission::create(['name' => 'view members']);
        Permission::create(['name' => 'add members']);
        Permission::create(['name' => 'edit members']);
        Permission::create(['name' => 'delete members']);

        Role::create(['name' => 'super-admin'])
            ->givePermissionTo(Permission::all());

        Role::create(['name' => 'admin'])
            ->givePermissionTo('add members');
    }

这是我的用户播种方法:

    public function run()
    {
        factory(User::class)->create([
            'name' => 'Arianna',
            'email' => 'arianna@example.com'
        ])->assignRole('super-admin');
    }

这些播种机很好,但我意识到用户 CRUD 界面没有正确显示角色

用户角色显示为“-”,

角色显示为 -

在此处输入图像描述

当我检查数据库时,model_has_roles 将 App\User 显示为模型类型

应用\用户模型类型:

在此处输入图像描述

我确定 model_type 应该是 App\Models\BackpackUser ,所以我现在再次尝试使用 BackpackUser 类播种

现在我遇到了不同的问题,BackpackUser 没有任何角色,因为角色需要在“背包”守卫中才能分配给 BackpackUser

 Spatie\Permission\Exceptions\RoleDoesNotExist  : There is no role named `super-admin`.

  at .\vendor\spatie\laravel-permission\src\Exceptions\RoleDoesNotExist.php:11
     7| class RoleDoesNotExist extends InvalidArgumentException
     8| {
     9|     public static function named(string $roleName)
    10|     {
  > 11|         return new static("There is no role named `{$roleName}`.");
    12|     }
    13|
    14|     public static function withId(int $roleId)
    15|     {

  Exception trace:

  1   Spatie\Permission\Exceptions\RoleDoesNotExist::named("super-admin")
      .\vendor\spatie\laravel-permission\src\Models\Role.php:91

  2   Spatie\Permission\Models\Role::findByName("super-admin", "backpack")
      .\vendor\spatie\laravel-permission\src\Traits\HasRoles.php:270

我有什么选择?为什么我不能使用默认配置正常播种?

请不要说我需要使用用户界面手动“播种”虚拟数据..

4

2 回答 2

1

当您创建角色和权限时,您应该使用以下方式定义背包防护backpack_guard_name()

Permission::create([
    'name' => 'view members',
    'guard_name' => backpack_guard_name()
]);

对角色执行相同的操作:

Role::create([
    'name' => 'super-admin',
    'guard_name' => backpack_guard_name()
]);

在您的桌子上,model_has_roles您的模型类型不能是App\User,它应该是Backpack\Base\app\Models\BackpackUser

use \Backpack\Base\app\Models\BackpackUser;
...

public function run()
{
    factory(BackpackUser::class)->create([
        'name' => 'Arianna',
        'email' => 'arianna@example.com'
    ])->assignRole('super-admin');
}

笔记:

BackpackUserextends App\User,这可能会给您带来问题,因为您User可能有自定义字段,并且通过使用BackpackUser您在工厂创建它时没有这些字段。

要解决此问题,您需要分两步完成。首先,App\User使用所有必填字段创建 ,然后将 User 作为BackpackUser对象分配角色或权限。

于 2019-07-24T11:17:46.247 回答
0

Spatie/Laravel-permission 导致的这个问题也将模型类型存储在数据库中,并将权限放在 BackpackUser 或 User 模型上。

好吧..最近才从这里得到答案:

https://github.com/Laravel-Backpack/PermissionManager/issues/193]

该解决方案刚刚从 tabacitu 于 2019 年底添加:

https://backpackforlaravel.com/docs/4.0/base-about#have-both-regular-users-and-admins

基本上你需要添加中间件,或者在 User 上添加 is_admin 列,或者使用 tabacitu 提供的中间件

于 2020-03-25T13:58:51.403 回答