我想了解如何爲涉及多租戶的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