mcpField
L
laravel-permission

laravel-permission

github.com/fusengine安全3462 次安装2 周前更新
代码仓库

关于 laravel-permission

面向 Laravel 开发者的 Spatie Laravel Permission 参考技能,涵盖基于角色的访问控制及其常见集成。内容还提供配置指南、代码模板和测试建议。

主要功能

  1. 01角色与权限管理
  2. 02路由中间件与 Blade 授权
  3. 03多租户团队权限范围
  4. 04通配符权限与超级管理员绕过
  5. 05API、Policy 与查询作用域
  6. 06缓存、审计事件与测试指南

适用场景

  1. 01为路由和界面配置授权
  2. 02按团队隔离多租户权限
  3. 03集成 API 身份验证与权限
  4. 04编写权限测试并管理缓存

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/fusengine/claude-plugins --skill laravel-permission

安装后在 Claude Code 中输入/laravel-permission确认已加载。

详细介绍

涵盖 Spatie Laravel Permission 的基于角色的访问控制:角色和权限、路由中间件、Blade 授权指令、多租户团队范围、通配符/层级权限、超级管理员绕过、缓存管理、直接权限与角色权限继承、查询范围、基于事件的审计日志、Policy 集成、Sanctum/Passport API 用法、自定义模型(支持 UUID)以及测试模式。

Laravel Permission (Spatie)

Agent 工作流(强制)

在进行任何实现之前,并行启动 3 个 Agent,每个 Agent 调用一次,并指定 name:

  1. fuse-ai-pilot:explore-codebase - 检查现有的身份验证模式
  2. fuse-ai-pilot:research-expert - 通过 Context7 核实 Spatie Permission 文档
  3. mcp__context7__query-docs - 检查 Laravel 授权模式

实现完成后,运行 fuse-ai-pilot:sniper 进行验证。


概览

Spatie Laravel Permission 为 Laravel 应用提供完整的基于角色的访问控制(RBAC)。

组件用途
Role权限组(admin、writer)
Permission单项能力(编辑文章)
Middleware路由保护
Blade DirectivesUI 授权
Teams多租户范围
Wildcards层级权限
Super Admin绕过所有检查
Events审计日志(v6.15.0+)
Query Scopes按角色/权限筛选用户
API SupportSanctum/Passport 集成
Policies基于资源的授权

关键规则

  1. 在 DatabaseSeeder 中填充角色/权限
  2. 更改后重置缓存:php artisan permission:cache-reset
  3. 使用 kebab-case 命名:edit-articles
  4. 控制器中绝不要硬编码角色检查——使用中间件
  5. 多租户应用应尽早设置团队上下文
  6. 为 API 指定 guard——permission:edit,api
  7. 在测试中清除缓存——在 setUp()/beforeEach() 中重置

参考指南

核心概念
主题参考资料何时查阅
Setupspatie-permission.md安装、模型设置、核心方法
Middlewaremiddleware.md路由保护模式
Bladeblade-directives.mdUI 授权指令
Direct vs Roledirect-permissions.md权限继承
高级功能
主题参考资料何时查阅
Teamsteams.md多租户权限
Wildcardswildcard-permissions.md层级模式
Super Adminsuper-admin.md绕过所有权限
Custom Modelscustom-models.mdUUID、扩展模型
集成
主题参考资料何时查阅
API Usageapi-usage.mdSanctum、guards、JSON 响应
Policiespolicies.mdLaravel Policy 集成
Query Scopesquery-scopes.mdUser::role()、User::permission()
Eventsevents.md审计日志、通知
运维与质量
主题参考资料何时查阅
Cachecache.md性能、调试
CLIartisan-commands.mdArtisan 命令
Testingtesting.md测试、工厂、设置
Performanceperformance.md优化、N+1、缓存

模板(代码示例)
设置与播种
模板用途
UserModel.php.md带有 HasRoles trait 的用户模型
RoleSeeder.php.md基本角色播种
PermissionSeeder.php.md权限创建播种器
WildcardSeeder.php.md分层权限
路由与中间件
模板用途
routes-example.md受保护路由示例
ControllerMiddleware.php.md控制器中的中间件
BladeExamples.blade.mdBlade 指令示例
团队与多租户
模板用途
TeamMiddleware.php.md多租户中间件
TeamSeeder.php.md团队范围角色播种器
TeamModel.php.md带有 boot 的团队模型
超级管理员与缓存
模板用途
SuperAdminSetup.php.mdGate::before 绕过
CacheConfig.php.md缓存配置
DeployScript.sh.mdCI/CD 缓存管理
API 集成
模板用途
ApiPermissionSetup.php.mdAPI guard + Sanctum
ApiExceptionHandler.php.mdJSON 错误响应
ApiUserResource.php.md带有权限的用户资源
策略与事件
模板用途
PostPolicy.php.md与 Spatie 集成的策略
PermissionEventListener.php.md审计事件监听器
UserQueryExamples.php.md查询作用域示例
PermissionAudit.php.md审计服务
测试
模板用途
PermissionTest.php.mdPest 与 PHPUnit 测试
UserFactory.php.md带有权限状态的工厂
自定义模型
模板用途
CustomRole.php.md扩展的 Role 模型
CustomPermission.php.md扩展的 Permission 模型
UUIDMigration.php.mdUUID 表迁移
SetupPermissions.php.md自定义 artisan 命令

快速参考

分配角色
$user->assignRole('admin');
检查权限
$user->can('edit articles');
中间件(Web)
Route::middleware(['role:admin'])->group(fn () => ...);
中间件(API)
Route::middleware(['auth:sanctum', 'permission:edit,api'])->group(fn () => ...);
Blade
@role('admin') ... @endrole
@can('edit articles') ... @endcan
查询作用域
User::role('admin')->get();
User::permission('edit articles')->get();
团队
setPermissionsTeamId($team->id);
通配符
$role->givePermissionTo('articles.*');
超级管理员
Gate::before(fn ($user, $ability) =>
    $user->hasRole('Super-Admin') ? true : null
);
测试
beforeEach(fn () => app(PermissionRegistrar::class)->forgetCachedPermissions());

功能矩阵

功能状态参考
基本 RBAC✅spatie-permission.md
中间件✅middleware.md
Blade 指令✅blade-directives.md
多守卫(web/api)✅middleware.md, api-usage.md
团队(多租户)✅teams.md
通配符权限✅wildcard-permissions.md
超级管理员✅super-admin.md
缓存管理✅cache.md
直接权限与角色权限✅direct-permissions.md
Artisan 命令✅artisan-commands.md
UUID 支持✅custom-models.md
自定义模型✅custom-models.md
事件(v6.15.0+)✅events.md
查询作用域✅query-scopes.md
策略集成✅policies.md
API / Sanctum✅api-usage.md
测试✅testing.md
性能✅performance.md

Laravel 13 说明

Spatie Permission 8.x(当前版本为 8.3,要求 PHP 8.3+ 和 Laravel 12/13)兼容 Laravel 13。L13 集成:

  • 从 v6 升级至 v7,再升至 v8:事件类以 Event 结尾(RoleAttachedEvent…),命令以 Command 结尾,clearClassPermissions() 已移除,findByName() / findOrCreate() 接受 BackedEnum|string(v8)——参见 events.md
  • 缓存:permission.cache.key 键在 config/permission.php 中保持显式设置(spatie.permission.cache)→ 不受 L13 改用连字符前缀的影响
  • 控制器属性:组合使用 #[Authorize](策略)和 #[Middleware('role:admin')](RBAC),命名空间为 Illuminate\Routing\Attributes\Controllers——参见 [[laravel-blade]]
  • PHP 8.3:为自定义 Role/Permission DTO 使用 final readonly class
#[Middleware(['auth', 'role:admin|editor'])]
#[Authorize('update', 'post')]
public function update(UpdatePostRequest $request, Post $post) { /* ... */ }

最佳实践

应该做
  • 定义唯一事实来源:策略或权限(二者不能同时用于同一操作)
  • 使用 permission:create-post(动词-名词)以保持清晰
  • 仅在确有多租户需求时启用 teams
  • 按用户缓存权限(Cache::remember('user.permissions.'.$id, ...))
  • 通过 Gate::before() 实现超级管理员权限(不要使用 * 通配符权限)
不应该做
  • 将权限存储在会话中(使用 Spatie 缓存)
  • 在缺乏一致架构的情况下混用 hasRole() 和 hasPermissionTo()
  • 在代码中硬编码角色名称(使用 RoleEnum 枚举)
  • 忘记在 Seeder 中调用 assignRole() 后清除缓存
  • 向超级管理员授予 *(优先使用有针对性的 Gate::before())

评论

支持 Markdown