笔记 - Laravel Permissions 权限组

参考文件:

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

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章