【问题标题】:Restricting hibernate queried data based upon the owning group of a user根据用户所属组限制休眠查询数据
【发布时间】:2025-12-23 22:55:20
【问题描述】:

标准示例可能是您在同一托管实例上向多家公司提供服务,并希望员工只能看到同一公司其他员工的数据,而不是潜在竞争公司的数据。

我正在使用 JBossAS7 和 Hibernate 4.x。

可以将公司信息从 UI 层下推,并在上面设置(无状态)持久层过滤器,但这对我来说似乎是个坏主意,我宁愿这样做在离数据库更近的地方。

我猜肯定有一个标准的、安全的解决方案,可能是围绕安全域或休眠会话?想法?提前致谢。

【问题讨论】:

    标签: java hibernate jboss multi-tenant


    【解决方案1】:

    您似乎正在构建一个“多租户应用程序”。 Hibernate 对多租户的支持目前非常有限,最近在 4.0.0.Alpha2 中完成了功能 request 5697。请注意,此功能请求不涉及在实体中添加租户鉴别器列,根据 JIRA 中的讨论,将在 4.0.0.Alpha3 或 4.1.0(通过 JIRA)中到达。目前,您可以将与各种租户相关的数据存储在不同的数据库或架构中。

    您还可以阅读related blog post,了解有关在 Hibernate 中实现多租户的各种选项;与 HHH-5697 中所做的工作相比,这已经相当老了,并且没有讨论如何在实体模型中创建具有租户鉴别器列的多租户应用程序。

    【讨论】:

    • 这看起来完全像我所追求的。我会关注最新的 4.x 版本。谢谢。
    • 不客气。顺便说一句,如果您使用的是 JPA,请注意 EclipseLink 已经支持 multitenancy
    【解决方案2】:

    我不确定任何标准,但我曾在两个重要的系统上工作过。这些过时的工具,如 Hibernate 和我们对 J2EE 的使用。

    在我参与过的所有系统中,我们都必须自己编写代码 - 使用 company 作为我们在请求中的键的一部分。

    一种可能性是对于每个客户来说,“无论您的数据库如何称呼它的分区”都是完全不同的。 (如果您在 Oracle 中,则为架构)。听起来更复杂,但它确实保证了公司之间的隔离,并且还允许对扩展或新/删除公司进行一些管理。在我以前的工作地点,我记得如果有人提到将多个公司的数据保存在同一张表中,法务人员会感到紧张——这让他们很高兴。

    您可以让您的应用服务器作为可以访问所有内容的受信任用户连接到数据库,或者确保在连接时传递最终用户的凭据。我听说过这个。从安全的角度来看,这听起来不错,并且意味着在像 Oracle 这样的数据库中,正确的事情就会发生。我还没有看到它完成,我想知道连接池的效果如何。

    编辑:Vineet 上面的回答似乎很好地涵盖了它。这是我必须更多关注的领域。我们这里可能有太多遗留代码需要更改。

    【讨论】: