问题描述
假设我在IAM数据库中有三个集合。
iam.policies
iam.resourceHierarchy
iam.roles
这些集合中的文档结构建模如下:
iam.policies
-包含定义一个或多个成员对给定资源具有哪些权限或权限集合(角色)的文档。每个文档的结构如下:
{
'resourceID': string
'bindings': [
{'members': [string],'permissions': [string]},{'members': [string],'role': ObjectId('<uuid>')}
]
}
例如
{
'resourceID': 'program1','bindings': [
{'members': ['user/user1@example.com'],permissions: ['projects.view']},{'members': ['user/user2@example.com'],role: ObjectId('role1')}
]
}
绑定中的role
字段引用了iam.roles
集合中定义的角色。
iam.resourceHierarchy
-包含用于定义给定资源的祖先关系的文档。每个文档的结构如下:
{
'resourceID': string
'parentID': string
}
例如
[
{
'resourceID': 'program1'
},{
'resourceID': 'project1','parentID': 'program1'
}
]
iam.roles
-包含定义系统中存在的角色的文档。角色只是权限列表顶部的命名抽象。此集合中的每个文档代表一个角色。例如
{
'title': string
'includedPermissions': [string]
}
例如
{
'title': 'Program Manager','includedPermissions': ['programs.view','programs.edit','projects.view','projects.edit']
}
我要做的是递归查找给定resourceID
的祖先链,并为每个祖先(包括resourceID
本身)获取策略(例如,来自iam.policies
个文档)并将它们合并在一起。
我使用了$graphLookup
函数来获取祖先链
db.resourceHierarchy.aggregate( [
{
$graphLookup: {
from: "resourceHierarchy",startWith: "$resourceID",connectFromField: "parentID",connectToField: "resourceID",as: "ancestors"
}
}
] )
然后成功返回祖先链。使用上面的示例,我将获得项目1的以下输出。
{
'resourceID': 'project1','parentID': 'program1','ancestors': [
{'resourceID': 'program1'},{'resourceID': 'project1','parentID': 'program1'}
]
}
但是我接下来该怎么办。现在,作为汇总的一部分,最好的方法是为bindings
集合中的每个祖先查找iam.policies
?
我已经研究了$lookup
函数,但无法使其正确加入策略集合的bindings
字段中。
{
'from': 'policies','startWith': '$resourceID','connectFromField': 'ancestors.resourceID','connectToField': 'bindings','as': 'bindings'
}
输出(例如对于项目1)
{
'resourceID': 'project1','parentID': 'program1'}
],'bindings': []
}
有人对此有任何建议或很好的例子吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)