直接装 spatie/permission 即可替代 Laravel 自带 Gate/Policy,需运行迁移、添加 HasRoles trait、清缓存;常见问题为漏迁移、trait 未加、缓存未清。

直接装 spatie/permission 就行,别碰 Laravel 自带的 Gate/Policy 手动配
这个包不是“补充”,是替代方案——它用数据库存角色和权限,自动挂钩 can() 和 @can,不用你手写 Gate::define。装错版本或漏迁移,后面所有 hasRole() 都返回 false。
- Laravel 10+ 用
composer require spatie/laravel-permission:^6.0(^5.0不兼容 PHP 8.2+) - 装完立刻跑
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider",否则config/permission.php不会出现 - 别跳过
php artisan migrate:4 张表(roles、permissions、model_has_roles、model_has_permissions)缺一不可
用户模型必须用 HasRoles trait,且不能和 Authenticatable 冲突
常见错误是复制粘贴时漏掉 use HasRoles;,或者加在了错误的模型上(比如用了 Admin 模型但没加 trait)。Laravel 默认的 User 模型没问题,但如果你用的是 App\Models\Admin,就必须手动加。
- 在对应模型顶部加
use HasRoles;,并在class声明后加上use HasRoles; - 确保该模型继承
Illuminate\Foundation\Auth\User或至少实现了Authenticatable合约 - 如果报
Call to undefined method hasRole(),先检查use是否拼错(比如写成Hasrole),再确认是否运行过composer dump-autoload
createRole() 和 givePermissionTo() 必须在数据库有数据后调用
别在 php artisan tinker 里试完就以为完事了——这些方法不写入缓存,每次调用都查库。如果权限名写错(比如 'edit post' 写成 'edit posts'),后续 @can('edit post') 一定失败,但不会报错,只会静默拒绝。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 创建角色用
$role = Role::create(['name' => 'admin']),别用new Role+save(),否则事件监听器不触发 - 给角色赋权限:先
$permission = Permission::create(['name' => 'delete user']),再$role->givePermissionTo($permission) - 给用户直接赋权限(绕过角色):用
$user->givePermissionTo('delete user'),但生产环境慎用——权限逻辑会散落各处
blade 中 @can 失效?先查 config/permission.php 的 cache.expiration_time
默认缓存 24 小时,改完权限不生效,大概率是缓存没清。不是 Blade 语法问题,也不是中间件没注册——Spatie 的中间件 RoleMiddleware 只管路由级角色校验,@can 走的是底层 Gate 适配层,完全依赖缓存键。
- 开发时把
config/permission.php里的'expiration_time' => \DateTimeInterface::MINUTE * 10改成 10 分钟 - 清缓存命令必须包含权限缓存:
php artisan cache:forget spatie.permission.cache(不是clear) - 如果用 Redis,确认
cache.stores.redis.connection配置正确,否则forget命令找不到键
事情说清了就结束。最常卡住的地方不是安装,是 migration 漏跑、trait 忘加、缓存键没清——这三个点占了 90% 的“为什么没权限”提问。

















