Spring: как инициализировать служебный компонент с использованием аутентифицированной информации о пользователеJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Spring: как инициализировать служебный компонент с использованием аутентифицированной информации о пользователе

Сообщение Anonymous »

Кажется, это распространенный случай, но я до сих пор не могу найти подходящего решения.
У меня есть служба, которая тесно связана с пользователем, прошедшим проверку подлинности в данный момент. Он должен тем или иным образом получить userId из контекста более высокого уровня (Контроллера) в качестве аргумента. Служба не может получить доступ к идентификатору пользователя из любого глобально доступного контекста аутентификации, его необходимо получить в качестве аргумента.
Служба также должна быть компонентом (@Service) ), поэтому Spring должен автоматически инициализировать его.
Один из способов добиться этого заключается в следующем:
  • Инициализируйте службу без идентификатора пользователя
  • Затем передайте идентификатор пользователя каждому методу, вызываемому в службе:

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

@Service
class MyService
public void method1(int userId) {
// do something with userId
}

public void method2(int userId) {
// do something with userId
}
end

// Usage
myService = new MyService(); // This is done by Spring (with no problem).
myService.method1(getUserIdFromAnyAuthContext())
myService.method2(getUserIdFromAnyAuthContext())
Я хотел бы, чтобы мой сервис работал (если бы он не был компонентом) следующим образом:

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

@Service
class MyService
private int currentUserId;

public MyService(int currentUserId) {
this.currentUserId = currentUserId;
}

public void method1() {
// do something with currentUserId
}

public void method2() {
// do something with currentUserId
}
end

// Usage
myService = new MyService(getUserIdFromAnyAuthContext()); // I want Spring to be able to do it and have MyService as a bean.
myService.method1()
myService.method2()
Приведенный выше пример показывает, как бы я это сделал, если бы это был не компонент. Дело в том, чтобы не передавать userId каждому методу. Его надо каким-то образом внедрять в сервис при каждом запросе, но при этом должно быть так, как будто я передал его стандартным Java-способом, чтобы его можно было тестировать независимо от внешнего контекста.
Как использовать службу в качестве bean-компонента и инициализировать ее с использованием данных аутентификации?
Обновлено:
В случае, если это имеет значение (отвечая на комментарий @Anish B.
): я собираюсь использовать Spring Security в качестве поставщика аутентификации. Но обратите внимание: сама служба не может получить доступ ни к одному глобально доступному контексту аутентификации, она должна быть независимой от внешнего контекста.

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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