4

我专门讨论的是带有 MongoDB 的 NodeJS(我知道 MongoDB 是无模式的,但让我们暂时了解结构化数据的重要性)。

是否有一些神奇的解决方案可以最大限度地减少对用户身份验证的数据库查询数量?例如,如果我的应用程序的业务逻辑需要确保用户具有从某个 Document 或 Collection 更新/检索数据的必要权限,是否有任何方法可以在不两次调用数据库的情况下做到这一点?一是检查用户是否有权限,二是检索必要的数据?

编辑:

触发快乐的 SO 版主关闭了另一个问题。我同意这个问题是抽象的,但我不明白它是如何“不是一个真正的问题”。简而言之:

在基于角色的应用程序中,特别是在 NodeJS + MongoDB 的上下文中,减少对数据库调用次数的最佳方法是什么?可以做到吗?还是 NodeJS + MongoDB 基于角色的访问控制效率低下且笨拙?

4

2 回答 2

2

显然,您知道哪些文件拥有哪些权利。我猜它是文档中的一个字段,例如:

{ 'foo':'bar'
  'canRead':'sales' }

在会话开始时,您可以查询用户拥有的角色。说

{ 'user':'shennan',
  'roles':[ 'users','west coast','sales'] }

您可以将该角色列表存储在用户的会话中。有了这些,剩下要做的就是使用$in操作符添加角色,如下所示:

db.test.find({'canRead':{'$in':['users','west coast','sales']})

运算符的值$in取自用户会话。这是在 mongo 控制台中自行尝试的代码:

db.test.insert(  { 'foo':'bar', 'canRead':'sales' })
db.test.insert(  { 'foo2':'bar2', 'canRead':['hr','sales'] })
db.test.insert(  { 'foo3':'bar3', 'canRead':'hr' })

> db.test.find({}, {_id:0})
{ "foo" : "bar", "canRead" : "sales" }
{ "foo2" : "bar2", "canRead" : [  "hr",  "sales" ] }
{ "foo3" : "bar3", "canRead" : "hr" }

销售人员无法读取带有“foo3”的文档:

> db.test.find({'canRead':{'$in':['users','west coast','sales']}}, {_id:0})
{ "foo" : "bar", "canRead" : "sales" }
{ "foo2" : "bar2", "canRead" : [  "hr",  "sales" ] }
于 2013-06-21T04:18:14.663 回答
0

绝对可行,但如果没有更多的上下文,很难确定什么是最好的。

想到的一种简单解决方案是将用户及其权限缓存在内存中,因此不需要进行数据库查找。此时,您只需对权限匹配的文档发出查询......

如果您需要更多想法,请告诉我。

于 2013-06-21T04:38:28.637 回答