如何跨模式和数据库对存储在表中的数据提供数据隔离/受控访问

Posted

技术标签:

【中文标题】如何跨模式和数据库对存储在表中的数据提供数据隔离/受控访问【英文标题】:How to provide data isolation/ controlled access over data stored in tables across schemas and databases 【发布时间】:2015-03-27 14:52:47 【问题描述】:

我想提供对存储在多个表中的数据的受控访问。访问是基于与用户关联的某些运行时属性决定的。我正在寻找一种可扩展、高性能且高度安全的解决方案。

插图: 有一个框架级模块存储多个其他模块的授权/访问相关数据。然后有n个模块管理它们自己的生命周期对象。例如模块 Test1 有 1000 个实例,这些实例被创建并存储在其基表中。作为框架解决方案,我想保护用户对这些数据的访问,因此我创建了一个特权概念,并将他们对用户的映射存储在我自己的表中。现在为了提供对数据的受控访问,我的目标是只向用户显示他/她有权访问的对象。

我的想法:

    我使用 oracle 数据库,目前我们正在使用 VPD(虚拟私有数据库),所以在这里我们在上述模块的每个基表上添加一个策略,它首先从权限评估当前登录用户的访问权限给他,然后将该数据附加到其他模块的每个基表的所有查询中(默认情况下由数据库本身)。 优点:非常高效且高度安全的解决方案。 缺点:如果基表和我们当前的表在两个不同的模式中,则无法工作。可能可以克服同一数据库实例中的两个不同架构,但我的一些集成器系统可能完全位于不同的数据库中。

    在java层设计: 我们通过 JPA 数据源连接到我们的数据库。所以我可以写一个薄层,基本上是一个对 EntityManager 的包装器,然后复制 VPD 为我所做的,首先从我的表中获取与访问相关的数据,然后在我的积分器的表上使用受监控的查询,然后可以缓存数据到缓存服务器(优化)。 缺点:我想在生产系统中使用它,因此想在第一时间完成它。想知道行业中已经实施的任何模式。

【问题讨论】:

【参考方案1】:

我认为您的解决方案不够灵活,无法在像您这样的复杂场景中正常工作。如果您有非常简单的查询,那么是的,您可以在数据库或“java”级别设计 SQL 筛选器之类的东西,然后通过所有查询。

但这并不灵活。一旦您的查询开始变得复杂,改进此查询筛选器将变得非常困难,因为它不是业务逻辑的一部分,并且无法了解您的权限系统的详细信息。

我建议您在服务层中实施一些访问检查。服务必须知道它为哪个用户生成或处理数据。将查询生成逻辑移动到存储库,并让您的服务根据用户权限调用不同的存储库方法。或者只是根据用户权限使用参数自定义存储库调用。

【讨论】:

感谢您的回复,这是我从中了解到的。 1)我不应该使用受监控的查询类型的概念,因为当查询变得复杂时,它将变得难以管理。我以前曾考虑使用 JPA 的“AdditionalCriteria”注释(现在已删除) 2)您建议我应该在我的集成器的架构中创建存储过程,当前用户的访问相关信息将传递到该架构中,并且该过程将返回过滤后的响应。 我在考虑不是在我的每个集成器的架构中创建过程,而是为他们提供一个用于获取数据的 java 库。在那个库中,我从我的数据库中获取当前用户的访问相关数据,从集成商的数据库中获取对象。根据访问级别对其进行过滤。这里要注意的是,如果我可以确保对集成商数据库的所有访问都通过我的库进行,那么它看起来是一个不错的解决方案,尽管我可能必须从规模的角度对其进行测试。程序更安全(但不如 VPD 安全),所以我想改进它。 @AashishBhandari 从我的角度来看,存储过程可以用于访问控制。我认为独立访问库也可以。只需确保只有您的图书馆才能完全访问数据库。不应允许任何客户端机器直接与 DB 对话。只能通过您的图书馆。

以上是关于如何跨模式和数据库对存储在表中的数据提供数据隔离/受控访问的主要内容,如果未能解决你的问题,请参考以下文章

关系数据库中如何存储xml数据?

无法使用休眠将引用键存储在表中

db2数据库某一个表增加新列后,如何改变该列在表中的排序?表右方的“上移”和“下移”好像都用不了。

如何将火花流输出转换为数据帧或存储在表中

MSSQL之三 在表中操纵数据

Redshift - 问题在存储在表中的表中显示时差