mcpField
L
laravel-permission

laravel-permission

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

关于 laravel-permission

面向 Laravel 开发者的 Spatie Laravel Permission 参考技能,用于设计基于角色和权限的访问控制。内容涵盖多租户团队、路由与界面授权、API 集成及测试。

主要功能

  1. 01配置角色与权限的 RBAC
  2. 02通过中间件和 Blade 控制访问
  3. 03支持团队范围与通配符权限
  4. 04集成 Policy、API Guard 和 Sanctum
  5. 05提供缓存、查询范围与事件审计指南
  6. 06涵盖自定义模型和测试模式

适用场景

  1. 01为 Laravel 路由配置角色或权限限制
  2. 02按租户团队管理角色和权限
  3. 03为 API 与 Policy 接入权限检查
  4. 04测试权限变更并管理权限缓存

安装

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

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

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

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
api-usage.md
artisan-commands.md
blade-directives.md
cache.md
custom-models.md
direct-permissions.md
events.md
middleware.md
performance.md
policies.md
query-scopes.md
spatie-permission.md
super-admin.md
teams.md
references/templates/
ApiExceptionHandler.php.md
ApiPermissionSetup.php.md
ApiUserResource.php.md
BladeExamples.blade.md
CacheConfig.php.md
ControllerMiddleware.php.md
CustomPermission.php.md
CustomRole.php.md
DeployScript.sh.md
PermissionAudit.php.md
PermissionEventListener.php.md
PermissionSeeder.php.md
PermissionTest.php.md
PostPolicy.php.md
RoleSeeder.php.md
routes-example.md

详细介绍

涵盖 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