Монго совокупный вложенный массив, поиск - PullRequest
2 голосов
/ 12 мая 2019

Я создаю веб-приложение с использованием MongoDB и Go, которое включает контроль доступа на основе ролей. Я храню информацию об этом в 2 коллекциях, permissions и roles.

Вот так выглядят эти две коллекции. Права доступа

{
    "operation": "create",
    "resource": "project"
}
{
    "operation": "read",
    "resource": "project"
}
{
    "operation": "update",
    "resource": "project"
}
{
    "operation": "delete",
    "resource": "project"
}
{
    "operation": "create",
    "resource": "user"
}

resource - это то, над чем выполняется operation. Так что, если есть какая-то операция, которая не может быть выполнена на каком-то ресурсе, тогда мне не нужно ее хранить. Например, пользователь может быть создан только потому, что только 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"
      }
    ]
}

Роли содержат роль, имя роли, отображаемой в пользовательском интерфейсе, и набор разрешений, которые имеет эта роль.

Мне нужно отправить эту информацию в пользовательский интерфейс, используя REST API в определенном формате, в котором будет описано, может ли определенная роль выполнять операцию с ресурсом или нет с использованием флага 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 }
        }
      }
   ]
}

Можно ли это сделать с помощью агрегирования монго? Или мне нужно внести изменения в мою схему, если да, то какие изменения я должен сделать.

...