必须启用 teams 功能并确保 roles 表含 company_id 字段,再按 company_id 查找角色、单独更新 name 并清除对应缓存,否则会导致跨公司权限错乱。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在 Laravel 多租户系统中,当多个公司(团队)共享同一套角色名但需逻辑隔离时,直接修改角色名可能引发跨团队权限错乱或数据覆盖。
确认是否启用了 teams 功能
打开 config/permission.php,检查 【'teams' => true】 是否已启用。若为 false,角色名全局唯一,此时修改任一角色名会直接影响所有公司——哪怕它们本应互不感知。
这一步必须先做。没开 teams 就去改角色名,等于在没关阀门的情况下拧水龙头。
验证角色是否绑定 company_id 字段
运行迁移检查:php artisan migrate:status | grep permission。确保已执行包含 【company_id】 的自定义迁移(如 create_roles_table_with_company_id),而非原始 laravel-permission 的 roles 表迁移。
如果 roles 表里没有 company_id 字段,所有公司共用同一张 roles 表,此时 rename('admin') 会让 A 公司的 admin 和 B 公司的 admin 同时被重命名——你改的不是“某个公司的角色”,而是“全系统的同名角色”。
安全修改共享角色名的操作路径
第一步:查出目标角色及其所属 company_id$role = Role::where('name', 'old_name')->where('company_id', 123)->first();
第二步:仅更新该角色的 name 字段,不碰其他字段$role->name = 'new_name'; $role->save();
第三步:清除该角色对应缓存app()['cache']->forget("spatie.permission.cache.{$role->id}");
不手动清缓存会导致视图或中间件仍读取旧 name,尤其是 role_or_permission 中间件可能持续拒绝合法请求。











