Маршрутизация базы данных с использованием MultiTenancy веснойJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Маршрутизация базы данных с использованием MultiTenancy весной

Сообщение Anonymous »

Я пытаюсь реализовать мультиарендность весной. Я использую JWT, и у меня есть tenant_id, хранящийся в JWT. Я настроил свой класс MultiTenantDataSourceRouter, расширяющий AbstractRoutingDataSource, чтобы ключ поиска был tenant_id.

Код: Выделить всё

@Override
protected Object determineCurrentLookupKey() {
var authentication = SecurityContextHolder.getContext().getAuthentication();
if(authentication!= null && authentication.getPrincipal() instanceof User user) {
return user.getTenant_id();
}
return null;
}
У меня также есть метод контроллера, который входит в систему пользователя. При входе в систему я хочу создать объект пользователя и сохранить его в базе данных, которая, как предполагается, принадлежит этому арендатору

Код: Выделить всё

public ResponseEntity loginUser(AuthenticateRequest authenticateRequest) {
//authenticate the User
authenticationManager
.authenticate(new UsernamePasswordAuthenticationToken(authenticateRequest.getEmail(),authenticateRequest.getPassword()));

//this line of code runs oly if authentication is successful
User user = userRepository.findByEmail(authenticateRequest.getEmail()).orElseThrow();
String jwt = jwtService.generateToken(user);

//set the security context to allow routing of db and to know the tenantID and also set the datasource
SecurityContextHolder.getContext()
.setAuthentication(new UsernamePasswordAuthenticationToken(user.getUsername(),null,user.getAuthorities()));

var mds = new MultiTenantDataSourceRouter();
mds.setTargetDataSources(dataSourceConfig.loadAllDataSources());
mds.afterPropertiesSet();

//create an Employee Object for the user once
Employee employee = employeeRepository.findByEmail(user.getEmail());
if(employee!= null){
Employee newEmployee = Employee.builder()
.email(user.getEmail())
.name(user.getName())
.build();
}
return ResponseEntity.ok().body(new AuthenticationResponse(jwt));
}
При запуске приложения у меня загружаются источники данных (dataSourceConfig.loadAllDataSources()). Это компонент, который возвращает карту tenant_id и соответствующие источники данных. Но когда я вызываю этот метод, источник данных по умолчанию, загружаемый в приложение через app.properties, находится там, где находится объект сотрудника, где ищется метод findbyEmail(). Я ожидаю, что он будет искать его внутри клиента, связанного с этим пользователем, но этого не происходит.
Это приводит к ошибке, поскольку в моей базе данных по умолчанию нет таблицы сотрудников.

Подробнее здесь: https://stackoverflow.com/questions/784 ... -in-spring
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Hibernate Multitenancy: изменение арендатора в сеансе (подход с использованием столбца дискриминатора)
    Anonymous » » в форуме JAVA
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Почему GlobalexceptionHandler всегда возвращает NoresourceFoundException весной и весной изменяет URI?
    Anonymous » » в форуме JAVA
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Целевой класс [currentTenant] не существует (Spatie/Multitenancy)
    Anonymous » » в форуме Php
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • SQLALCHEMY MULTITENANCY (общая таблица)
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Динамическая маршрутизация с использованием маршрутов из базы данных
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»