我正在尝试使用 mongodb 为节点实现我自己的 acl 模块。我知道其中一些已经存在,但出于体验目的,我想创建自己的:)。
我们将有roles
和users
。每个role
都会有一些permissions
上一些resource
。每个role
人也可能有一个父母角色。这个育儿部分目前正在阻止我。
1)我该如何实施?我读了另一篇将我指向 mongodb doc 的 SO 帖子:Embedding vs linking,所以我最好的方法似乎是使用引用来实现东西:
roles collection :
[{
_id: "my_role_1"
},
{
_id: "my_role_2",
parents: ["my_role_1"]
},
{
_id: "my_role_3",
parents: ["my_role_2"]
}]
这是正确的做法吗?由于 nodejs 是异步的,因此获取 my_role_3 (I mean my_role_3 -- my_role_2 -- my_role_1
) 的“育儿树”是一场噩梦:
function getRoleParenting(roleName, callback) {
this.db.collection('roles', function(err, collection) {
collection.findOne({role: roleName}, function(err, role) {
role.parents.forEach(function(roleParent) {
// I know I should call the function recursively,
// But I can't figure out how to get the full "tree"
// at the end... In a sync way, I would use "return"...
// How can I do here ?
// getRoleParenting(roleParent._id);
}
});
});
}
2)正如我所说,node_acl 是一个已经这样做的节点模块。我看到他们为每个角色创建了一个集合。因为我可能有很多很多不同的角色,所以我决定避免使用这个解决方案,因为在 mongodb 文档中他们说当查询意味着少量集合时性能会更好。我的选择是否正确,避免使用这种方法?
谢谢。