Mongodb Mongo聚合嵌套数组,查找
我正在使用MongoDB和Go创建一个web应用程序,其中包括基于角色的访问控制。我将这方面的信息存储在两个集合中,Mongodb Mongo聚合嵌套数组,查找,mongodb,go,mgo,Mongodb,Go,Mgo,我正在使用MongoDB和Go创建一个web应用程序,其中包括基于角色的访问控制。我将这方面的信息存储在两个集合中,权限和角色 这就是这两个系列的外观。 权限 { "operation": "create", "resource": "project" } { "operation": "read", "resource": "project" } { "operation": "update", "resource": "project" } {
权限
和角色
这就是这两个系列的外观。
权限
{
"operation": "create",
"resource": "project"
}
{
"operation": "read",
"resource": "project"
}
{
"operation": "update",
"resource": "project"
}
{
"operation": "delete",
"resource": "project"
}
{
"operation": "create",
"resource": "user"
}
资源
是执行操作的对象。因此,如果有一些操作无法在某些资源上执行,那么我不需要存储它。例如,只能创建用户,因此只需存储create
user
。
目前,在应用程序范围内只有4个操作(创建、读取、更新、删除),但可能会增加,如上传
可能会出现
角色
角色包含角色、要在UI上显示的角色的名称以及该角色拥有的权限集
我需要使用特定格式的REST API将此信息发送到UI,该格式将描述特定角色是否可以使用checked
标志对资源执行操作,以及是否可以使用isEditable
标志对资源执行特定操作。
例如,permissions集合不包含对资源用户的删除操作,因此它不应该是可编辑的,因此该标志设置为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聚合执行此操作?或者我是否需要在模式中进行修改,如果需要,那么应该进行哪些修改。我可以通过3个步骤解决问题:
包括每个角色的所有权限,并添加一个名为checked
的标志。这增加了数据冗余,但这不是什么大问题
在角色
集合中的资源
字段上执行分组依据
在服务器端将isEditable
设置为false时,为每个资源填充缺少的特权
我必须遍历服务器端的数据,但这是我能想到的最有效的方法。为什么不将所需的文档存储到单个集合中?还有,你试过什么?
{
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 }
}
}
]
}