我想提供对存储在多个表中的数据的受控访问。基于与用户相关联的某些运行时属性来决定访问。我正在寻找一种可扩展,高效且高度安全的解决方案。
插图:
存在框架级模块,其存储用于多个其他模块的授权/访问相关数据。然后有n个模块来管理自己的生命周期对象。例如模块Test1有1000个实例,它们被创建并存储在其基表中。作为框架解决方案,我想保护用户对此数据的访问,因此我创建了一个权限概念,并将其映射存储在我自己的表中的用户。现在提供对数据的受控访问,我的目标是仅向用户显示他/她可以访问的对象。
我心中的方法:
我使用oracle数据库,目前我们正在使用VPD(虚拟专用数据库),所以在这里我们在上述模块的每个基表上添加一个策略,首先评估当前登录用户对权限的访问权限给予他,然后将数据附加到其他模块的每个基表的所有查询中(默认情况下由数据库本身)。
PROS:非常高效且高度安全的解决方案
缺点:如果基表和我们当前的表在两个不同的模式中,则无法工作。可以克服同一数据库实例中的两个不同模式,但我的一些集成商系统可能完全在不同的数据库中。
java层设计:
我们通过JPA数据源连接到我们的数据库。所以我可以在EntityManager上编写一个薄层,基本上是一个包装,然后复制VPD为我做的事情,首先从我的表中获取访问相关数据,然后在我的积分器表上使用受监视的查询,然后可以缓存数据进入缓存服务器(优化)
缺点:我想在生产系统中使用它,因此希望在第一次拍摄中完成它。想了解业内已经实施的任何模式。
答案 0 :(得分:0)
我认为您的解决方案不够灵活,无法在像您这样的复杂场景中正常运行。如果您有非常简单的查询,那么您可以在数据库或" java"中设计类似SQL筛选器的东西。级别,然后只是通过所有的查询。
但这不灵活。一旦您的查询开始变得复杂,改进此查询筛选器将变得非常困难,因为它不是业务逻辑的一部分,并且无法知道您的权限系统的详细信息。
我建议您在服务层中实施一些访问检查。服务必须知道它生成或处理数据的用户。将查询生成逻辑移动到存储库,并让您的服务根据用户权限调用不同的存储库方法,例如。或者只使用参数自定义存储库调用,具体取决于用户权限。