refactor(权限): 统一权限命名规范并精简权限数量
- 移除冗余的 viewAny 权限,统一使用 view 权限 - 简化权限描述,去掉「列表」和「详情」的区分 - 权限数量从 45 个精简到 32 个 - 更新 RolePolicy 使用统一的 role.view 权限 - 创建迁移脚本自动更新现有权限并合并关联 - 验证所有角色权限分配正确(super-admin: 32, admin: 28, user: 6)
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Spatie\Permission\Models\Permission;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
// 权限名称映射(旧名称 => 新名称)
|
||||
$permissionMapping = [
|
||||
// 文档管理
|
||||
'document.viewAny' => 'document.view',
|
||||
|
||||
// 系统设置
|
||||
'system-setting.viewAny' => 'system-setting.view',
|
||||
|
||||
// 操作日志
|
||||
'activity-log.viewAny' => 'activity-log.view',
|
||||
|
||||
// 终端管理
|
||||
'terminal.viewAny' => 'terminal.view',
|
||||
|
||||
// SOP模板
|
||||
'sop-template.viewAny' => 'sop-template.view',
|
||||
|
||||
// 分组管理
|
||||
'group.viewAny' => 'group.view',
|
||||
|
||||
// 用户管理
|
||||
'user.viewAny' => 'user.view',
|
||||
|
||||
// 角色管理
|
||||
'role.viewAny' => 'role.view',
|
||||
];
|
||||
|
||||
foreach ($permissionMapping as $oldName => $newName) {
|
||||
$oldPermission = Permission::where('name', $oldName)->first();
|
||||
|
||||
if ($oldPermission) {
|
||||
// 检查新权限是否已存在
|
||||
$newPermission = Permission::where('name', $newName)->first();
|
||||
|
||||
if (!$newPermission) {
|
||||
// 如果新权限不存在,直接重命名
|
||||
$oldPermission->name = $newName;
|
||||
$oldPermission->save();
|
||||
} else {
|
||||
// 如果新权限已存在,需要合并权限关联
|
||||
// 将旧权限的所有角色关联转移到新权限
|
||||
$roles = $oldPermission->roles;
|
||||
foreach ($roles as $role) {
|
||||
if (!$role->hasPermissionTo($newName)) {
|
||||
$role->givePermissionTo($newName);
|
||||
}
|
||||
}
|
||||
|
||||
// 将旧权限的所有用户关联转移到新权限
|
||||
$users = $oldPermission->users;
|
||||
foreach ($users as $user) {
|
||||
if (!$user->hasPermissionTo($newName)) {
|
||||
$user->givePermissionTo($newName);
|
||||
}
|
||||
}
|
||||
|
||||
// 删除旧权限
|
||||
$oldPermission->delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 删除不再需要的详情查看权限
|
||||
$detailPermissions = [
|
||||
'document.view',
|
||||
'system-setting.view',
|
||||
'activity-log.view',
|
||||
'terminal.view',
|
||||
'sop-template.view',
|
||||
'group.view',
|
||||
'user.view',
|
||||
'role.view',
|
||||
];
|
||||
|
||||
foreach ($detailPermissions as $permName) {
|
||||
// 只删除描述为"查看xxx详情"的权限(如果存在重复)
|
||||
$permissions = Permission::where('name', $permName)->get();
|
||||
if ($permissions->count() > 1) {
|
||||
// 保留第一个,删除其他
|
||||
$permissions->skip(1)->each(function ($permission) {
|
||||
$permission->delete();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 清除权限缓存
|
||||
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
// 不支持回滚,因为权限合并后无法准确还原
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user