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



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

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

我心目中的方法:

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

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

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

但这是不灵活的。一旦你的查询开始变得复杂,改进这个查询筛选程序就会变得非常困难,因为它不是商业逻辑的一部分,也不知道你的权限系统的细节。

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

相关内容

最新更新