是否有人在MongoDB中提供了对访问控制进行建模的示例?我在想的情况是:
有一组资源,每个资源都是自己的文档(例如汽车,人,树木等)。
用户可以通过显式授予或通过成为其他集合(例如角色)中存在的资源所有者或其他隐式方式隐式获得资源访问权限。
在一个collection.find()方法中,可以应用跳过和限制选项(用于分页),有没有一种方法可以检查所有这些显式和隐式路径并产生用户可以访问的资源的结果?
在MySQL中,我们使用带有资源ID,授予用户ID,授权用户ID和操作(读,写等)的授权表对此进行了建模。然后,在一个查询中,我们选择至少一个子查询为真的所有资源,然后这些子查询会检查所有不同的路径以访问例如一个检查赠款,一个检查所有权等。
我只是无法在MongoDB中做到这一点,我不确定这是否有可能...
谢谢
最佳答案
您一次不能查询多个文档。理想情况下,访问控制不应成为业务逻辑的一部分。您的后端php/C#/language应该确保当前请求得到授权。如果是这样,则只需查询所请求的文档即可。
如果您觉得需要在mongodb中实现完全相同的结构,我建议您不要这样做,那么您将需要嵌入所有这些字段(其他mysql表中的字段,这些字段可帮助您确定请求是否已被授权)在每个馆藏的每个文档中。您将复制数据(对其进行规范化)。这给确保所有副本都被更新并具有相同的值带来了麻烦。
编辑1:
让我们谈谈汽车文件。要跟踪其所有者,您将拥有owner
属性(它将包含所有者文档的_id
)。要跟踪所有可以“使用”(明确授予)汽车的用户,您将拥有一个allowerdDrivers
数组(它将包含每个_id
文档的user
)。让我们假设发出请求的当前用户属于“admin”角色。 user
文档将具有一个applicableRoles
数组,该数组存储适用的每个角色文档的_id
。
要检索用户有权访问的所有汽车,您只需进行两个查询。一个扮演他的角色。如果他是管理员,请退回所有汽车。如果不是,则进行另一个查询,其中owner
等于他的ID or
allowedDrivers
包含他的ID。
我知道您的实际用例可能会更复杂,但是有一种解决此问题的面向文档的方法。您必须意识到,在文档中对数据建模的方式与在RDbMS中进行建模的方式大不相同。
关于node.js - 在MongoDB中建模访问控制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13548601/