我现在想了太多,没有明显正确的解决方案。这可能是一个真正的以木换树的情况,所以我需要 stackoverflow 的帮助。
我试图在区域基础上强制执行数据库过滤。我的系统有各种用户,每个用户都被分配到一个区域办事处。我只希望用户能够看到与其区域办事处关联的数据。
简而言之,我的应用程序是:Java App -> JPA (hibernate) -> MySQL
数据库包含所有区域的对象,但我只希望用户能够操作他们自己区域的对象。我考虑过以下方法:
1) 修改所有数据库查询,使它们读取类似 select * from tablex where region="myregion"的内容。这很讨厌。它不适用于 JPA,例如 entitymanager.find() 方法只接受主键。当然我可以本地化,但我只需要错过一个 select 语句,我的安全性就会受到威胁
2) 使用 mysql 代理来过滤结果。有点古怪,但是 mysql 代理只看到原始调用,并不知道应该如何过滤它们(即发出此请求的用户属于哪个区域)。好的,我可以为每个区域启动一个代理,但它开始变得有点困惑..
3) 为每个区域使用单独的架构。是的,很简单,我使用的是 spring,所以我可以使用 RoutingDataSource 通过正确的数据源(每个模式 1 个数据源)来路由请求。当然,现在的问题出在我想要按地区和其他类别进行过滤的某个地方。哦。
4) ACL - 对此不太确定。如果 a 做了一个 select * from tablex;它会安静地过滤掉我无权访问的对象,还是会抛出大量访问异常?
但是我是不是想太多了?这似乎是一个非常普遍的问题。必须有一些简单的解决方案,我太笨了,看不到。我确定它会接近/或在数据库中,因为您想尽可能接近源进行过滤,但是呢?
不想被灌输 - 任何链接、关键字、想法、商业/开源产品建议都将不胜感激!谢谢。
最佳答案
在过去的几周里,我一直在实现类似的东西(REALbasic 与 MySQL 对话),用于对会计包进行分层的多公司扩展。
有大量的现有代码组成 SQL 语句,因此我们不得不忍受这一点,并进行大量审计以确保适本地在每个表中包含限制。一个陷阱是相关查找,其中查找表通常仅与主表结合使用,但对于某些维护,GUI 会直接加载查找表本身。
有泄露隐含信息的危险,例如透露 Acme Pornstars 是公司某个部门的客户 ;-)
该部分的唯一解决方案是非常仔细地构造 DB 图以显示所有隐含关系和大量审计和 grepping 源代码,并仔细注释以指出不需要额外限制的区域。
我想出的一种模式是在未来使它更加通用,而不是显式的 region=currentRegionVar 类型搜索,而是使用由全局 CurrentEntityForRole("blah") 函数提供的任意实体 ID。
这种抽象允许共享一些数据以及实现代表其他限制边界的伪实体。
我对 Java 和 Spring 的了解还不够多,无法判断,但是有没有一种方法可以使用 View 来提供单键查找,其中 View 受区域过滤器限制?
提供聚合和可能的数据共享的愿望是我们没有走单独的数据库路线的原因。
关于database - 如何根据应用程序用户属性限制或过滤数据库访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/433707/