You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:27:19