有没有人有一个在MongoDB中建模访问控制的例子?我想的情况是:
有一组资源,每个资源都是他们自己的文件(例如汽车,人,树等)。
用户可以通过显式授权获取对资源的访问权限,或者通过成为资源的所有者,存在于另一个集合(例如角色)或其他一些隐式方式中来隐式访问。
在一个collection.find()方法中,可能有跳过和限制选项(对于分页),有没有办法检查所有这些显式和隐式路径并产生用户有权访问的资源的结果? / p>
在MySQL中,我们使用具有资源ID的授权表,授予用户ID,授权用户ID和操作(读取,写入等)来对其进行建模。然后,我们在一个查询中,选择至少有一个子查询为真的所有资源,然后子查询检查要访问的所有不同路径,例如一个人检查补助金,一个人检查所有权等。
我无法在MongoDB中完成此操作,我不确定它是否可能......
由于
答案 0 :(得分:3)
您一次不能查询多个文档。理想情况下,不应将访问控制作为业务逻辑的一部分。您的后端php / c#/ language应该确保当前请求被授权。如果是,则只需查询所请求的文档。
如果您觉得,您需要在mongodb中实现完全相同的结构,我建议您不要这样做,那么您将需要嵌入所有这些字段(来自其他mysql表的字段,帮助您确定是否请求在每个集合的每个文档中被授权)。您将复制数据(对其进行非规范化)。这带来了确保所有副本都更新并具有相同价值的头痛。
编辑1:
让我们谈谈Car文件。要跟踪其所有者,您将拥有owner
属性(这将包含所有者文档的_id
)。要跟踪可以“使用”(明确授予)汽车的所有用户,您将拥有一个数组allowerdDrivers
(这将包含每个_id
文档的user
。让我们假设发出请求的当前用户属于'admin'角色。 user
文档将包含一个数组applicableRoles
,用于存储每个适用的角色文档的_id
。
要检索用户有权访问的所有汽车,您只需要进行两次查询。一个来取他的角色。如果他是管理员,请返回所有车辆。如果不是,请再次提出owner
等于其身份or
allowedDrivers
包含其ID的查询。
我理解您的实际用例可能更复杂,但是有可能存在一种以文档为导向的解决方法。您必须意识到,在文档中建模数据的方式与在RDbMS中建模数据的方式大不相同。
答案 1 :(得分:0)
在业务逻辑中执行它会非常缓慢且效率低下。
怎么样?这是业务逻辑,如果用户拥有帖子b然后让他们做动作(MVC风格),否则不要。
这听起来像是业务逻辑,大多数框架都认为这个业务逻辑被置于控制器动作中(MVC范例);即在PHP中Yii:
Yii::app()->roles->hasAccess('some_view_action_for_a_post', $post)
我认为通过在数据库端执行此操作,您会将存储层与业务层混淆。
同样,基于某些角色的权限操作可以获得的查询有多复杂,您提交的查询必须与许多子选择相当大。考虑MySQL如何创建和处理结果集(子选择ARE NOT JOINS),我感觉这些查询不能很好地扩展。
此外,您还必须考虑何时需要更改角色或定义角色的函数,这些角色可以访问某个对象,您必须直接更改SQL查询,而不是仅仅将角色添加到角色表和为该角色分配对象属性并为用户分配该角色(AKA代码更改)。
所以我会认真研究其他语言中的其他框架(以及你自己的)如何做他们的RBAC,因为我认为你已经模糊了这条线,并且用你所做的事情使你的生活变得非常艰难,事实上这里可能是一个好的开始的地方:Group/rule-based authorization approach in node.js and express.js