0

我正在使用 Laravel 和 spatie/laravel-permission 包,如本教程中所述。但是,当我尝试创建虚拟数据时,它返回以下错误Spatie\Permission\Exceptions\RoleDoesNotExist : There is no role named Admin

下面是生成虚拟数据的类。

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // Ask for db migration refresh, default is no
        if ($this->command->confirm('Do you wish to refresh migration before seeding, it will clear all old data ?')) {
            // Call the php artisan migrate:refresh
            $this->command->call('migrate:refresh');
            $this->command->warn("Data cleared, starting from blank database.");
        }

        // Seed the default permissions
        Permission::firstOrCreate(['name' => 'Administer roles & permissions', 'guard_name' => 'isAdmin']);


        $this->command->info('Default Permissions added.');

        // Confirm roles needed
        if ($this->command->confirm('Create Roles for user, default is admin and user? [y|N]', true)) {

            // Ask for roles from input
            $input_roles = $this->command->ask('Enter roles in comma separate format.', 'Admin,User');

            // Explode roles
            $roles_array = explode(',', $input_roles);

            // add roles
            foreach($roles_array as $role) {
                $role = Role::firstOrCreate(['name' => trim($role), 'guard_name' => 'isAdmin']);

                if( $role->name == 'Admin' ) {
                    // assign all permissions
                    $role->syncPermissions(Permission::all());
                    $this->command->info('Admin granted all the permissions');
                } else {
                    // for others by default only read access
                    $role->syncPermissions(Permission::where('name', 'LIKE', 'view_%')->get());
                }

                // create one user for each role
                $this->createUser($role);
            }

            $this->command->info('Roles ' . $input_roles . ' added successfully');

        } else {
            Role::firstOrCreate(['name' => 'User']);
            $this->command->info('Added only default user role.');
        }

        // now lets seed some posts for demo
        $this->command->info('Some Posts data seeded.');
        $this->command->warn('All done :)');
    }

    /**
     * Create a user with given role
     *
     * @param $role
     */
    private function createUser($role)
    {
        $user = factory(User::class)->create();
        $user->assignRole($role->name);

        if( $role->name == 'Admin' ) {
            $this->command->info('Here is your admin details to login:');
            $this->command->warn($user->email);
            $this->command->warn('Password is "secret"');
        }
    }
}

有什么办法解决吗?

4

3 回答 3

1

你需要跑

php artisan cache:forget spatie.permission.cache

使用角色或权限之前

于 2018-11-07T10:54:53.633 回答
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:56:32.117 回答
0

我通过更改 config/auth.php 文件中保护的顺序来修复此错误:

这是默认的

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'jwt',
            'provider' => 'users',
        ],
    ],

这就是我现在所拥有的

    'guards' => [
        'api' => [
            'driver' => 'jwt',
            'provider' => 'users',
        ],
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    ],

我发现当我将默认保护更改为"api"时出现此错误(默认情况下它设置为"web")。

当您在不更改顺序的情况下播种角色时,它会正确地将guard_name 设置为“api”,但是当它想将这些角色应用于用户时,它可能会使用“web”防护。

如果您使用的是默认保护并且仍然出现此错误,请尝试在角色播种器中设置 guard_name 字段,如下所示

Role::create(['name' => 'admin', 'guard_name' => 'web']);
于 2018-11-26T07:51:52.197 回答