Mongo 聚合嵌套数组,查找

我正在使用 MongoDB 和 Go 创建一个 Web 应用程序,其中包括基于角色的访问控制。我将有关此的信息存储在 2 个集合中,permissions并且roles.


这就是这两个集合的样子。权限


{

    "operation": "create",

    "resource": "project"

}

{

    "operation": "read",

    "resource": "project"

}

{

    "operation": "update",

    "resource": "project"

}

{

    "operation": "delete",

    "resource": "project"

}

{

    "operation": "create",

    "resource": "user"

}

resourceoperation是执行an 的对象。所以如果有一些操作不能在某些资源上执行,那么,我不需要存储它。例如,只能创建用户,因此只create user需要存储。目前在应用程序范围内只有 4 个操作(创建、读取、更新、删除),但可能会增加,比如upload可能会出现。


角色


{

    "role": "admin",

    "display_name": "Administrator",

    "permissions": [

      {

        "operation": "create",

        "resource": "project"

      },

      {

        "operation": "read",

        "resource": "project"

      },

      {

        "operation": "update",

        "resource": "project"

      },

      {

        "operation": "delete",

        "resource": "project"

      }

    ]

}

角色包含角色,要在 UI 上显示的角色名称以及该角色拥有的权限集。


我需要使用特定格式的 REST API 将此信息发送到 UI,这将描述特定角色是否可以使用标志对资源执行操作,以及对资源的checked特定操作是否可通过使用进行编辑国旗isEditable。例如,权限集合不包含对资源用户的删除操作,因此它不应是可编辑的,因此标志设置为 false。同样可以创建用户,因此将其设置为 true。


 {

    display_name: "System Administrator",

    role: "admin",

    permissions: [

      {

        resource: "user",

        privilages: {

          create: { checked: false, isEditable: true },

          delete: { checked: false, isEditable: false },

          update: { checked: false, isEditable: false },

          read: { checked: false, isEditable: false }

        }

      },

      {

        resource: "project",

        privilages: {

          create: { checked: true, isEditable: true },

          delete: { checked: true, isEditable: true },

          update: { checked: true, isEditable: true },

          read: { checked: true, isEditable: true }

        }

      }

   ]

}

是否可以使用 mongo 聚合来执行此操作?或者我是否需要在我的架构中进行修改,如果是,那么我应该进行哪些修改。


心有法竹
浏览 158回答 1
1回答

SMILET

我能够通过 3 个步骤解决问题:包括每个角色的所有权限并添加一个名为checked. 这增加了数据冗余,但这不是一个大问题。在集合中做一个group by现场。resourceroles在服务器端privileges为每个resource设置为 false 的人填充缺失值。isEditable我不得不在服务器端遍历数据,但这是我能想到的最有效的方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go