NestJS实现RBAC时如何将动态权限数组转换为指定嵌套JSON
实现方案
核心逻辑是按-拆分每个权限字符串,自动构建嵌套层级:拆分后的最后一段是操作权限,存入对应位置的{name: 操作名}数组;前面所有段自动作为嵌套对象的层级,不需要提前写死权限层级关系,适配任意深度的动态权限数组。
直接可用的工具函数代码如下:
function buildPermissionTree(flatPermissions) { const permissionTree = {}; for (const perm of flatPermissions) { // 拆分权限路径 const segments = perm.split('-'); // 最后一段是具体操作权限 const action = segments.pop(); let currentNode = permissionTree; // 逐层构建嵌套对象 for (let i = 0; i < segments.length; i++) { const key = segments[i]; const isPathEnd = i === segments.length - 1; // 节点不存在则初始化:路径末端初始化为操作数组,非末端初始化为空对象 if (!currentNode[key]) { currentNode[key] = isPathEnd ? [] : {}; } currentNode = currentNode[key]; } // 追加操作权限,自动去重 if (!currentNode.some(item => item.name === action)) { currentNode.push({ name: action }); } } return permissionTree; } // 使用示例 const permissions = [ "newsfeeds-alerts-view", "settings-group_details-view", "settings-group_details-edit", "settings-privileges-view", "settings-privileges-edit", "settings-my_groups-create", "settings-my_groups-view", "settings-my_groups-edit", "settings-my_groups-delete", "settings-users-view", "settings-users-edit", "settings-users-delete", "notifications-email-create", "notifications-jira-create", "notifications-jira-view", "notifications-non_itr_ticket-create", "notifications-non_itr_ticket-update", "workspace_dashboard-worksapce-create", "workspace_dashboard-worksapce-view", "dashboard-geographic-maps-view", "dashboard-geographic-report-itr-view", "configurations-create_alerts-create", "configurations-notifications-jira-create" ]; const nestedPerms = buildPermissionTree(permissions); // 转JSON字符串直接调用序列化方法即可 const permJsonStr = JSON.stringify(nestedPerms, null, 2);
方案特性
- 无层级限制:自动适配任意深度的权限路径,不需要提前维护模块、子模块的映射关系,完全支持动态生成的权限数组
- 自动去重:如果输入数组存在重复权限项,不会重复添加相同操作
- 零依赖:纯原生JavaScript实现,在NestJS项目中可以直接作为工具方法引入使用,不需要安装第三方包
- 易扩展:如果后续需要给权限节点加其他属性(比如权限描述、是否启用),只需要在push操作项的时候追加对应字段即可
注意:你给出的目标输出示例中把
configurations节点归到了dashboard层级下,和原始权限字符串的拆分规则不符(这两个权限是configurations-开头,不是dashboard-configurations-开头),上述代码是严格按照-拆分的路径生成结构。如果确实需要把configurations归类到dashboard下,只需要在遍历权限时给这两个路径手动补上dashboard前缀即可。
在NestJS中使用时,可以把这个方法封装到权限相关的工具类或者服务中,在查询用户权限、返回权限树给前端的逻辑里直接调用即可。
内容的提问来源于stack exchange,提问作者Abhilash Shajan
相关产品推荐
相关产品推荐

