我正在使用MongoDB和Go创建一个Web应用程序,其中包括基于角色的访问控制。我将与此相关的信息存储在sessionInfo()
和permissions
2个集合中。
这是这两个集合的外观。 权限
roles
{
"operation": "create",
"resource": "project"
}
{
"operation": "read",
"resource": "project"
}
{
"operation": "update",
"resource": "project"
}
{
"operation": "delete",
"resource": "project"
}
{
"operation": "create",
"resource": "user"
}
是执行resource
的对象。因此,如果某些操作无法在某些资源上执行,则无需存储它。例如,只能创建用户,因此仅需要存储operation
create
。
目前,在应用程序范围内只有4种操作(创建,读取,更新,删除),但可以增加,例如user
可能会出现。
角色
upload
角色包含角色,要在UI上显示的角色名称以及该角色具有的权限集。
我需要使用REST API以特定格式将此信息发送到UI,该格式将描述特定角色是否可以使用{
"role": "admin",
"display_name": "Administrator",
"permissions": [
{
"operation": "create",
"resource": "project"
},
{
"operation": "read",
"resource": "project"
},
{
"operation": "update",
"resource": "project"
},
{
"operation": "delete",
"resource": "project"
}
]
}
标志对资源执行操作,以及是否对通过使用标志checked
,资源是否可编辑。
例如,权限集合不包含对资源用户的删除操作,因此它不应是可编辑的,因此将flag设置为false。同样,可以创建用户,因此将其设置为true。
isEditable
是否可以使用mongo聚合来执行此操作?还是我需要在架构中进行修改?如果是,那么我应该进行哪些修改。
答案 0 :(得分:1)
我可以通过 3 个步骤解决问题:
checked
的标志。这增加了数据冗余,但这不是大问题。group by
集合中的 resource
字段上执行 roles
。privileges
设置为 false,为每个 resource
填充缺失的 isEditable
。我不得不在服务器端遍历数据,但这是我能想到的最有效的方法。