繁体   English   中英

在 MongoDB 中建模访问控制

[英]Modelling Access Control in MongoDB

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

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

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

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

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

我只是无法在 MongoDB 中做到这一点,我不确定这是否可能......

谢谢

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

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

编辑1:

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

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

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

在业务逻辑中这样做会非常缓慢且效率低下。

为何如此? 这是业务逻辑,如果用户 a 拥有帖子 b,则让他们执行操作(MVC 样式),否则不执行。

对我来说这听起来像是业务逻辑,大多数框架都认为这个业务逻辑被放置在控制器操作中(MVC 范式); 即在 PHP Yii 中:

Yii::app()->roles->hasAccess('some_view_action_for_a_post', $post)

我认为通过在数据库端执行此操作,您将存储层与业务层混淆了。

此外,某些基于角色的权限操作可以获得您提交的查询的复杂程度,并且必须有很多子选择。 考虑到 MySQL 如何创建和处理结果集(子选择不是联接),我觉得这些查询的扩展性不是特别好。

此外,您还必须考虑何时更改角色或定义角色的函数,该函数可以访问某个对象,您必须直接更改 SQL 查询,而不仅仅是将角色添加到角色表并分配对象该角色的属性并为用户分配该角色(AKA 代码更改)。

所以我会认真研究其他语言(和你自己的)的其他框架如何做他们的 RBAC 因为我认为你已经模糊了界限并且你所做的事情让你的生活变得很艰难,事实上这里可能是一个很好的起点: node.js 和 express.js 中基于组/规则的授权方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM