У меня есть служба, которая тесно связана с пользователем, прошедшим проверку подлинности в данный момент. Он должен тем или иным образом получить 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()
Как использовать службу в качестве bean-компонента и инициализировать ее с использованием данных аутентификации?
Обновлено:
В случае, если это имеет значение (отвечая на комментарий @Anish B.
): я собираюсь использовать Spring Security в качестве поставщика аутентификации. Но обратите внимание: сама служба не может получить доступ ни к одному глобально доступному контексту аутентификации, она должна быть независимой от внешнего контекста.
Подробнее здесь: https://stackoverflow.com/questions/791 ... -user-info