gpt4 book ai didi

java - 使用 Spring 和 Hibernate 以及 Tomcat 在无状态环境中实现 Multi-Tenancy

转载 作者:行者123 更新时间:2023-11-28 22:01:28 25 4
gpt4 key购买 nike

我正在尝试了解我们如何为涉及 Multi-Tenancy 的 SaaS 产品构建 RESTful API。技术栈是Java,使用Spring和Hibernate,部署一个WAR到Tomcat。

我的主要问题是我们如何在 REST 调用中维护 tenant_id,以便应用程序在执行 CRUD 时使用正确的数据库连接。看到 Tomcat 使用线程池并重用线程我们不应该使用 ThreadLocal。

我已经读到 slf4j 支持使用用于日志记录的 MDC 实现。 servelet 过滤器会预先维护 tenant_id 并在过滤器退出时将其清除。因此,记录器在消息中使用正确的 tenant_id。

同时使用 ThreadLocal 违背了无状态原则,因为这会隐式添加一个状态。

此外,创建某种包含 tenant_id 并传递它的 ContextSession 对象的想法似乎并不能解决我的问题。由于此对象将向下传递到 DAL 和 DAO 的层以加载对象。我想避免此 ContextSession 类上的这种高耦合,以及必须将其包含在许多方法签名中。

如何在无状态环境中实现 Multi-Tenancy ?

最佳答案

当用户登录到您的应用程序时,他们会以某种方式与租户相关联。所以应该可以从 spring SecurityContext 访问租户信息。

例如,如果我有一个包含 2 个租户的应用程序;租户A和租户B。登录时,用户需要以某种方式指明他们属于哪个租户。这可以通过多种方式完成,例如使用不同的主机名(例如 tenantA.myapp.com、tenantB.myapp.com)或 url 参数,或者在登录表单上输入租户信息。在对用户进行身份验证时,您需要使用与特定租户关联的身份验证领域。作为身份验证的一部分,应将 spring SecurityContext 设置为包含可让您在用户的后续服务调用中确定用户属于哪个租户的信息。 SecurityContext 应该可以从应用程序的不同服务层访问,而无需为此进行任何显式编程。

关于java - 使用 Spring 和 Hibernate 以及 Tomcat 在无状态环境中实现 Multi-Tenancy ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42684769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com