Laravel8中Spatie Roles and Permission如何修改默认模型而非使用User模型
Laravel 8 搭配的 Spatie Roles and Permission v4 及以上版本完全支持绑定非默认User模型的其他自定义模型做角色、权限相关操作,完整配置流程如下:
前置准备
首先确保你已经完成Spatie权限包的基础安装:
- 已通过composer安装适配Laravel8的v4版本权限包:
composer require spatie/laravel-permission:^4.0 - 已执行发布命令生成配置文件和迁移文件:
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" - 已执行迁移生成权限相关数据表:
php artisan migrate
配置流程
1. 配置自定义模型对应的Auth守卫
打开config/auth.php,新增自定义模型对应的守卫和用户提供者,示例以Admin自定义模型为例:
return [ // ... 其他原有配置 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], // 新增Admin模型对应的守卫 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], // 新增Admin模型对应的用户提供者 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], ], // ... 其他原有配置 ];
2. 给自定义模型引入权限Trait
在你的自定义模型(示例为App\Models\Admin)中引入HasRoles Trait:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Spatie\Permission\Traits\HasRoles; class Admin extends Authenticatable { use HasFactory, HasRoles; // 必须引入HasRoles Trait protected $fillable = [ 'name', 'email', 'password', ]; protected $hidden = [ 'password', 'remember_token', ]; }
3. 创建对应守卫的角色和权限
创建角色、权限时需要指定对应的guard_name为你新增的守卫名:
use Spatie\Permission\Models\Role; use Spatie\Permission\Models\Permission; // 创建admin守卫下的角色 $adminRole = Role::create([ 'name' => '超级管理员', 'guard_name' => 'admin' ]); // 创建admin守卫下的权限 $editUserPerm = Permission::create([ 'name' => '编辑用户', 'guard_name' => 'admin' ]); // 给角色绑定权限 $adminRole->givePermissionTo($editUserPerm);
4. 权限操作使用示例
给自定义模型对象分配角色、校验权限时,指定对应守卫即可:
$admin = Admin::find(1); // 分配角色 $admin->assignRole('超级管理员'); // 校验权限 var_dump($admin->hasPermissionTo('编辑用户')); // 输出bool(true) // 中间件校验时指定守卫 Route::group(['middleware' => ['auth:admin', 'role:超级管理员,admin']], function () { // 管理员后台路由 });
注意事项
- 配置修改后如果不生效,先执行命令清空缓存:
php artisan cache:clear、php artisan config:clear,Spatie权限包默认会缓存权限配置,清缓存后才会加载最新配置。 - 如果有多个自定义模型需要做权限控制,只需要给每个模型都引入
HasRolesTrait,分别配置对应的守卫即可,不同守卫下的角色、权限互相隔离,不会冲突。
内容的提问来源于stack exchange,提问作者dev__rezo
相关产品推荐
相关产品推荐

