【发布时间】:2018-07-05 21:56:31
【问题描述】:
因此,我正在开展下一个需要更详细的访问控制功能的项目(即 Sally 只能查看她所在部门的产品)。
我了解基于角色的访问控制模型或属性访问控制模型如何“包装”API 调用以确定给定用户是否可以对给定对象执行所述操作。
当您处理返回记录集合的 GET 调用时,我一直卡住的地方。如果我从该端点向 API 请求包含 20 条记录的页面,我无法获得 20 条记录,然后在返回它们之前对这些记录运行基于代码的授权检查,因为我很可能不会返回 20 条记录。
似乎授权检查要么必须在数据库中关闭和/或在数据库查询之前通过向查询调用添加额外的过滤器(即同时过滤产品部门 = 服装)进行。
任何人有任何更具体的实现示例或想法如何以高性能的方式实现?
【问题讨论】:
-
通常使用一组单独的表来指定每个域对象和用户的角色和访问权限 (ACL)。通过面向方面的编程(AOP),通常可以从业务方法本身中提取此类检查,这些检查使用方法所需的适当要求进行注释,以便用户能够执行它。如果成功,则调用该方法,并且 AOP 逻辑可能会过滤掉任何不允许调用用户的域对象。
-
虽然说得通,但也意味着当分页条件传入 DAO 时,它只返回符合条件的前 X 条记录。但是,在 AOP 过滤器完成其工作后,即使数据库中确实有 X 条记录与条件和身份验证检查匹配,返回的记录也可能少于 X 条。因此,查询运行后发生的 AOP 逻辑不起作用。
-
最理想的版本是,如果您流式传输结果并在您有 n 个要返回的条目后停止。分页视图也不能保证您会看到每个条目一次。想象一下,如果在两个连续的页面请求期间插入或删除数据。这可能会影响显示项目的页面。它可能会在多个页面上显示相同的项目(取决于插入的频率)或根本不显示,因为删除了前一个项目,条目将从顶部移动下一页到当前页的底部。
-
您可以使用 XACML 在 API 或 API 网关甚至数据库中进行数据级过滤...
-
David,我又在谷歌上搜索,但您有什么具体的资源可以推荐用于在数据库级别使用 XACML。到目前为止,我还没有在那个领域看到任何东西,我不想重新发明轮子。
标签: rest rbac abac role-base-authorization