MongoDB 中的访问控制建模

Tyl*_*ler 5 database datamodel mongodb node.js

有人有 MongoDB 中访问控制建模的例子吗?我想到的情况是:

有一组资源,每个资源都有自己的文档(例如汽车、人、树木等)。

用户可以通过显式授予来获得对资源的访问权,或者通过成为存在于另一个集合中的资源的所有者(例如角色)或一些其他隐式方式来隐式地获得对资源的访问权。

在一个 collection.find() 方法中,可以应用跳过和限制选项(用于分页),是否有一种方法可以检查所有这些显式和隐式路径并生成用户有权访问的资源的结果?

在 MySQL 中,我们使用带有资源 ID、授予用户 ID、授权用户 ID 和操作(读、写等)的授权表对此进行建模。然后,我们在一个查询中选择至少一个子查询为真的所有资源,然后子查询检查所有不同的访问路径,例如一个检查授权,一个检查所有权等。

我只是无法集中精力在 MongoDB 中执行此操作,我不确定这是否可能......

谢谢

Ami*_*rge 3

您一次不能查询多个文档。理想情况下,访问控制不应成为业务逻辑的一部分。您的后端 php/c#/language 应该确保当前请求被授权。如果是这样,则只需查询所请求的文档即可。

如果您觉得需要在 mongodb 中实现完全相同的结构,但我建议您不要这样做,那么您将需要嵌入所有这些字段(其他 mysql 表中的字段可帮助您识别请求是否已授权)在每个集合的每一个文档中。您将复制数据(对其进行非规范化)。这带来了确保所有副本都更新并具有相同值的麻烦。

编辑1:

我们来谈谈汽车文件。要跟踪其所有者,您将拥有owner财产(这将包含_id所有者文档)。要跟踪可以“使用”(显式授予)汽车的所有用户,您将有一个数组allowerdDrivers(这将包含_id每个user文档的 )。让我们假设发出请求的当前用户属于“admin”角色。该user文档将有一个数组applicableRoles,用于存储_id每个适用的角色文档。

要检索用户有权访问的所有汽车,您只需进行两次查询。一个来获取他的角色。如果他是管理员,则归还所有车辆。如果他不是,则进行另一个查询,其中ownerequals his idor allowedDrivers包含他的 id。

我知道您的实际用例可能更复杂,但很可能有一种面向文档的方法来解决这个问题。您必须认识到,在文档中对数据进行建模的方式与在 RDbMS 中对数据进行建模的方式有很大不同。