我现在考虑的太多,没有明显正确的解决方案。它可能是一个真正的木树换树木的情况,所以我需要stackoverflow的帮助。
我正在尝试在区域基础上强制执行数据库过滤。我的系统有各种用户,每个用户都被分配到一个区域办事处。我只希望用户能够看到与其地区办事处相关的数据。
简单地说我的应用程序是:Java App - > JPA(休眠) - > MySQL的
数据库包含来自所有区域的对象,但我只希望用户能够操作来自其自己区域的对象。我已经考虑过以下几种方法:
1)修改所有数据库查询,以便他们从tablex中读取select * from region =“myregion”。这很讨厌。它与JPA不兼容,例如entitymanager.find()方法只接受主键。当然,我可以去当地,但我只需要错过一个选择声明,我的安全性就会被拍摄
2)使用mysql代理过滤结果。有点时髦,但是mysql代理只是看到原始调用,并不真正知道它应该如何过滤它们(即发出此请求的用户属于哪个区域)。好吧,我可以为每个地区开始代理,但它开始变得有点混乱......
3)为每个区域使用单独的模式。是的,简单,我使用spring,所以我可以使用RoutingDataSource通过正确的数据源(每个模式1个数据源)路由请求。当然,现在问题就在某个地方,我想要按区域和其他类别进行过滤。 ohps。
4)ACL - 对此不太确定。如果a从tablex做了select *;它会悄悄过滤掉我无法访问的对象,还是会抛出一堆访问异常?
但我是否在考虑这个问题呢?这似乎是一个非常普遍的问题。必须有一些简单的解决方案,我太愚蠢了。我确信它会接近/或在数据库中,因为你想尽可能地过滤到源,但是什么?
不希望被勺子 - 任何链接,关键字,想法,商业/开源产品建议将非常感谢!感谢。
答案 0 :(得分:1)
好问题。
似乎#1是最好的,因为它是最灵活的。
地区恰好是你今天过滤的地方,但明天可能是地区+部门+头发的颜色。
如果你开始过多地分析数据,似乎你会被困在工作之上而不是将它们全部粘合在一起进行报告。
答案 1 :(得分:1)
在过去的几周里,我一直在实施类似的事情(REALbasic与MySQL交谈),以便对会计软件包进行分层多公司扩展。
有大量现有代码组成SQL语句,因此我们不得不忍受这种情况,并且只是进行大量审计以确保每个表中都包含适当的限制。其中一个问题是相关的查找,其中查找表通常只与主表结合使用,但对于某些维护,GUI会直接加载查找表本身。
存在泄露隐含信息的危险,例如披露Acme Pornstars是公司某部门的客户; - )
该部分的唯一解决方案是非常仔细地构建数据库图表以显示所有隐含的关系以及大量的审计和贪图源代码,并仔细评论以指示已经确定的区域,因为不需要额外的限制。
我想出的另一种模式是,使用由全局CurrentEntityForRole(“blah”)函数提供的任意entityID,而不是显式的region = currentRegionVar类型搜索。 p>
这种抽象允许共享一些数据以及实现代表其他限制边界的伪实体。
我对Java和Spring的了解不够,但有没有办法可以使用视图来提供单键查找,其中视图受区域过滤器的限制?
提供聚合和可能的数据共享的愿望是我们没有沿着单独的数据库路线走下去的原因。
答案 2 :(得分:0)
我遇到了同样的问题。很难相信这样一个共同的任务(根据用户配置文件过滤模型实体列表)没有“标准”方式,模式或最佳实践。
我找到了pgacl,一个PostgreSQL模块。基本上,您可以像往常一样进行查询,然后使用acl_access()谓词作为过滤器。
也许MySQL有类似的东西。
答案 3 :(得分:0)
我建议你使用ACL。它比其他选择更灵活。使用Spring Security。您可以在不使用Spring Framework的情况下使用它。阅读link text
中的教程