- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
有人有在 MongoDB 中建模访问控制的示例吗?我想到的情况是:
有一组资源,每个资源都是自己的文档(例如汽车、人、树等)。
用户可以通过显式授权或隐式地成为资源的所有者、存在于另一个集合(例如角色)或其他一些隐式方式来访问资源。
在一个 collection.find() 方法中,可以应用跳过和限制选项(用于分页),有没有办法检查所有这些显式和隐式路径并生成用户有权访问的资源的结果?
在 MySQL 中,我们使用带有资源 ID、授予用户 ID、授权用户 ID 和操作(读取、写入等)的授权表对其进行建模。然后,我们在一个查询中选择至少一个子查询为真的所有资源,然后子查询检查所有不同的访问路径,例如一个检查拨款,一个检查所有权等。
我只是无法在 MongoDB 中解决这个问题,我不确定这是否可能...
谢谢
最佳答案
一次不能查询多个文档。理想情况下,访问控制不应成为业务逻辑的一部分。您的后端 php/c#/language 应确保当前请求已获得授权。如果是,则只需查询请求的文档。
如果你觉得你需要在 mongodb 中实现完全相同的结构,我建议你不要这样做,那么你将需要嵌入所有这些字段(来自其他 mysql 表的那些帮助你识别请求是否被授权)在每个集合的每个文档中。您将复制数据(对其进行非规范化)。这带来了确保所有副本都更新并具有相同值的麻烦。
编辑 1:
让我们谈谈 Car 文件。要跟踪其所有者,您将拥有 owner
属性(这将包含所有者文档的 _id
)。要跟踪所有可以“使用”(明确授予)汽车的用户,您将有一个数组 allowerdDrivers
(这将包含每个 _id
文档的 user
)。让我们假设发出请求的当前用户属于“管理员”角色。 user
文档将有一个数组 applicableRoles
存储 _id
适用的每个角色文档。
要检索用户有权访问的所有汽车,您只需进行两次查询。一个去取他的角色。如果他是管理员,请归还所有汽车。如果他不在,则再次查询 owner
等于他的 id or
allowedDrivers
包含他的 ID。
我知道您的实际用例可能更复杂,但很可能有一种面向文档的方法来解决这个问题。您必须认识到,数据在文档中建模的方式与您在 RDbMS 中建模的方式大不相同。
关于node.js - 在 MongoDB 中建模访问控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13548601/
我是一名优秀的程序员,十分优秀!