5

我现在考虑太多了,没有明显正确的解决方案。这可能是一个真正的木头换树的情况,所以我需要 stackoverflow 的帮助。

我正在尝试在区域基础上强制执行数据库过滤。我的系统有不同的用户,每个用户都分配到一个区域办事处。我只希望用户能够看到与其区域办事处相关的数据。

简单来说我的应用是:Java App -> JPA (hibernate) -> MySQL

数据库包含来自所有地区的对象,但我只希望用户能够操作来自他们自己地区的对象。我考虑过以下方法:

1) 修改所有数据库查询,以便它们读取类似 select * from tablex where region="myregion" 的内容。这很讨厌。它不适用于 JPA,例如 entitymanager.find() 方法只接受主键。当然我可以原生,但我只需要错过一个选择语句,我的安全性就会被击中

2)使用mysql代理过滤结果。有点时髦,但是 mysql 代理只看到原始调用并且并不真正知道它应该如何过滤它们(即发出此请求的用户属于哪个区域)。好的,我可以为每个区域启动一个代理,但它开始变得有点混乱..

3) 为每个区域使用单独的模式。是的,很简单,我使用的是 spring,所以我可以使用 RoutingDataSource 通过正确的数据源(每个模式 1 个数据源)路由请求。当然,现在的问题出在我想要按地区和其他类别进行过滤的某个地方。哦哦。

4) ACL - 对此不太确定。如果 a 做了一个 select * from tablex; 它会悄悄地过滤掉我无权访问的对象还是会抛出大量访问异常?

但是我是不是想太多了?这似乎是一个非常普遍的问题。必须有一些简单的解决方案,我太笨了,看不到。我敢肯定它会接近/或在数据库中,因为您希望过滤尽可能接近源,但是什么?

不希望被灌输 - 任何链接、关键字、想法、商业/开源产品建议将不胜感激!谢谢。

4

4 回答 4

1

好问题。

似乎 #1 是最好的,因为它是最灵活的。

地区恰好是您今天要过滤的内容,但明天可能是地区+部门+头发颜色。

如果您开始过多地分割数据,那么您似乎将不得不更加努力地将它们重新粘合在一起以进行报告。

于 2009-01-12T03:34:58.997 回答
1

在过去的几周里,我刚刚为会计包的分层多公司扩展实现了类似的东西(REALbasic 与 MySQL 对话)。

有大量现有代码组成 SQL 语句,因此我们不得不忍受这些代码,并且只需进行大量审计以确保每个表中都包含适当的限制。一个问题是相关查找,其中查找表通常仅与主表结合使用,但对于某些维护 GUI 会直接加载查找表本身。

存在泄露隐含信息的危险,例如透露 Acme Pornstars 是该公司某些部门的客户 ;-)

该部分的唯一解决方案是非常仔细地构建 DB 图表以显示所有隐含的关系以及大量的审计和 grepping 源代码,并仔细注释以指示已经确定为不需要额外限制的区域。

我想出的一种模式是使用由全局 CurrentEntityForRole("blah") 函数提供的任意 entityID,而不是显式的 region=currentRegionVar 类型搜索,而不是显式地进行搜索。

这种抽象允许共享一些数据以及实现代表其他限制边界的伪实体。

我对 Java 和 Spring 知之甚少,无法分辨,但有没有一种方法可以使用视图来提供单键查找,其中视图受区域过滤器限制?

提供聚合和可能的数据共享的愿望是我们没有采用单独的数据库路线的原因。

于 2009-01-12T08:49:51.467 回答
0

我有同样的问题。很难相信这样一项常见的任务(根据用户配置文件过滤模型实体列表)没有“标准”方式、模式或最佳实践。

我找到了pgacl,一个 PostgreSQL 模块。基本上,您像往常一样进行查询,然后添加 acl_access() 谓词作为过滤器。

也许 MySQL 也有类似的东西。

于 2009-02-06T13:03:14.927 回答
0

我建议你使用 ACL。它比其他选择更灵活。使用弹簧安全。您可以在不使用 Spring Framework 的情况下使用它。从链接文本中阅读教程

于 2009-06-18T12:54:54.567 回答