Мультитенанс с Spring security JPA - PullRequest
3 голосов
/ 15 марта 2012

Это продолжение этой Многопользовательской работы с Spring JPA

Я решил использовать «AbstractRoutingDataSource».Но теперь проблема заключается в инициализации источника данных и компонента управления объектами при запуске.есть ли способ настроить это весной, каким образом он будет инициализироваться после аутентификации пользователя?

Еще одна проблема, о которой я могу подумать, - как обрабатывать параллелизм.Я поместил tenantId в этот класс

public class ThreadLocalContextUtil {
 private static final ThreadLocal<String> contextHolder =
            new ThreadLocal<String>();

   public static void setTenantId(String tenantId) {
      Assert.notNull(tenantId, "customerType cannot be null");
      contextHolder.set(tenantId);
   }

   public static String getTenantId() {
      return (String) contextHolder.get();
   }

   public static void clearTenant() {
      contextHolder.remove();
   }
}

Решение, которое я могу придумать, состоит в том, чтобы удалить tenantId после инициализации источника данных.это правильно?

1 Ответ

3 голосов
/ 18 марта 2012

Я решил похожую проблему. Я реализовал свой собственный TenantAwareDataSource на основе AbstractDataSource Spring. Требуется tenantId от bean-объекта в области сеанса с именем tenantContext . Этот компонент обновляется каждый раз при обработке входящего запроса. Это делается с помощью фильтра безопасности Spring Security:

<security:http auto-config='false' >
    <security:custom-filter before="FIRST" ref="tenantFilter" />
    <!-- ...more security stuff... -->
</security:http>

My TenantAwareDataSource инициализируется во время запуска, но это не имеет значения, поскольку оно создано пустым - оно содержит нет источников данных арендатора (например, объединенные источники данных JDBC или менеджер сущностей JPA). Они создаются лениво, когда getConnection() вызывается впервые для выбранного арендатора.

Итак, мой TenantAwareDataSource поддерживает свою собственную динамическую карту источника данных, в то время как AbstractRoutingDataSource ожидает статической инициализации карты источника данных, выполненной во время запуска.

Подробнее читайте в этой статье .

...