为了账号安全,请及时绑定邮箱和手机立即绑定

Mongo 聚合嵌套数组,查找

Mongo 聚合嵌套数组,查找

Go
心有法竹 2023-06-19 14:02:21
我正在使用 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 聚合来执行此操作?或者我是否需要在我的架构中进行修改,如果是,那么我应该进行哪些修改。
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

我能够通过 3 个步骤解决问题:

  1. 包括每个角色的所有权限并添加一个名为checked. 这增加了数据冗余,但这不是一个大问题。

  2. 在集合中做一个group by现场。resourceroles

  3. 在服务器端privileges为每个resource设置为 false 的人填充缺失值。isEditable

我不得不在服务器端遍历数据,但这是我能想到的最有效的方法。


查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信