Laravel 背包许可播种 "role does not exist"

Laravel Backpack Permission seeding "role does not exist"

我想在 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 作为模型类型

App\User model_type:

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

进行播种

现在我遇到了不同的问题,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

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

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

创建角色和权限时,应使用 backpack_guard_name():

定义背包守卫
Permission::create([
    'name' => 'view members',
    'guard_name' => backpack_guard_name()
]);

对角色执行相同操作:

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

在你的table上,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');
}

注:

BackpackUser extends App\User,这可能会给你带来问题,因为你的 User 可能有自定义字段,而使用 BackpackUser 你在创建时没有这些它在工厂。

要解决这个问题,您需要分两步完成。首先,创建包含所有必填字段的 App\User,然后将用户作为 BackpackUser 对象获取以分配角色或权限。

此问题由 Spatie/Laravel-permission 引起,还将模型类型存储在数据库中,并将权限放在 BackpackUser 或 User 模型上。

嗯..最近刚从这里得到答案:

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

解决方案是 2019 年底从 tabacitu 添加的:

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

基本上您需要添加中间件,在用户上添加 is_admin 列或使用 tabacitu

提供的中间件