我想了解如何为涉及多租户的SaaS产品构建RESTful API。技术栈是使用Spring和Hibernate的Java,并将WAR部署到Tomcat。在使用Spring和Hibernate和Tomcat的无状态环境中实现多租户
我的主要问题是我们如何维护REST调用中的tenant_id,以便应用程序在执行CRUD时使用正确的数据库连接。看到Tomcat使用线程池并重用线程,我们不应该使用ThreadLocal。
我读过slf4j支持MDC实现进行日志记录。 servelet过滤器会保留tenant_id,并在过滤器退出时将其清除。因此,记录器在消息中使用正确的tenant_id。
同时使用ThreadLocal违背了无状态原则,因为这隐含地增加了一个状态。
此外,创建某种持有tenant_id并传递它的ContextSession对象的想法似乎不能解决我的问题。因为这个对象将传递给DAL和DAO的层来加载对象。我想避免在这个ContextSession类上的这种高度耦合,以及不得不将它包含在许多方法签名中。
如何在无状态环境中实现多租户?
谢谢。所以在DAO中,我将如何为用户的tenant_id注入SecurityContex?我认为其范围将会议? –
查看http://www.baeldung.com/get-user-in-spring-security,了解有关如何访问SecurityContext的想法 – httPants
另外,SecurityContext不一定必须是会话作用域。如果你使用类似oauth2的无状态会话,请求中使用的令牌将存储在securitycontext中并包含领域信息(它将告诉你租户)。 – httPants