我现在考虑太多了,没有明显正确的解决方案。这可能是一个真正的木头换树的情况,所以我需要 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; 它会悄悄地过滤掉我无权访问的对象还是会抛出大量访问异常?
但是我是不是想太多了?这似乎是一个非常普遍的问题。必须有一些简单的解决方案,我太笨了,看不到。我敢肯定它会接近/或在数据库中,因为您希望过滤尽可能接近源,但是什么?
不希望被灌输 - 任何链接、关键字、想法、商业/开源产品建议将不胜感激!谢谢。