参考文件:
spatie permission官网Laravel 9 User Roles and Permissions Tutorial Example一、安装
使用指令安装:
composer require spatie/laravel-permissionphp artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
并使用 migrate
php artisan migrate
⚠️如果你的身份 Model 中的 ID 不是预设的整数
则需要修改自动生成的 migration create_permission_tables.php
,把 model_morph_key
原先的 unsignedBigInteger 改成 string:
Schema::create($tableNames['model_has_roles'], function (Blueprint $table) use ($tableNames, $columnNames, $teams) { $table->unsignedBigInteger(PermissionRegistrar::$pivotRole); $table->string('model_type'); // $table->unsignedBigInteger($columnNames['model_morph_key']); $table->string($columnNames['model_morph_key']);
在自己的 Model 下也要确认是否有设置好:
protected $primaryKey = 'id';public $incrementing = false;protected $keyType = 'string';
如果没设定好,在 model_has_roles
表中的 model_id
会为 0,正确应为身份组 Model 的 id。
二、建立简单的权限与身份
假设使用 Seeder 建立初始的身份与权限:
php artisan make:seeder CreateRole
找到建立的 datebase/seeders/CreateRole.php
:
use Spatie\Permission\Models\Role;use Spatie\Permission\Models\Permission;...public function run() { app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions(); Permission::create(['name' => 'edit articles']); Permission::create(['name' => 'delete articles']); Permission::create(['name' => 'publish articles']); Permission::create(['name' => 'unpublish articles']); $role = Role::create(['name' => 'writer']); $role->givePermissionTo(Permission::all()); }
如果是多个 guards 则需要加上 guard_name
,否则会使用 auth.gurads 的第一个做为预设:
Permission::create(['guard_name' => 'store', 'name' => 'unpublish articles']);$role = Role::create(['guard_name' => 'store', 'name' => 'writer']);
三、给予/删除/检查 身份
文件
假设我们已经找到目标的 $user :
// 新增$user->assignRole('writer');$user->assignRole('writer', 'admin');$user->assignRole(['writer', 'admin']);// 同步(会删掉原本的,使权限跟同步的一致)$user->syncRoles(['writer', 'admin']);// 删除$user->removeRole('writer');// 检查$user->hasRole('writer');$user->hasRole(['editor', 'moderator']);
四、检查权限
文件
假设我们已经找到目标的 $user :
$user->can('edit articles');$user->hasPermissionTo('edit articles');$user->hasAllPermissions(['edit articles', 'publish articles', 'unpublish articles']);
五、Wildcard
修改 config/permission.php
:
'enable_wildcard_permission' => true,
建立权限:
Permission::create('name' => 'posts']);Permission::create('name' => 'posts.create']);Permission::create('name' => 'posts.read']);Permission::create('name' => 'posts.update']);Permission::create('name' => 'posts.delete']);// 建立一个有全部权限的Role$role = Role::create('name' => 'admin']);$role->givePermissionTo('posts');// 建立一个只能 read 的Role$role = Role::create('name' => 'reader']);$role->givePermissionTo('posts.read');
验证:
$user->syncRoles('admin');$user->can('posts'); // true$user->can('posts.create'); // true$user->can('posts.read'); // true$user->can('posts.xxxx'); // true$user->syncRoles('reader');$user->can('posts'); // false$user->can('posts.create'); // false$user->can('posts.read'); // true$user->can('posts.xxxx'); // false