Я использую многоуровневую архитектуру Spring, выполняю авторизацию запросов в классах обслуживания.Один сервис может выглядеть так:
@Service
public class SomeService {
public void findOne(Long id) {
assertPrivilege("READ");
// ...
}
}
Теперь assertPrivilege()
использует SecurityContextHolder
для получения списка GratedAuthority
объектов.Внедряя логику авторизации в сервисы, контролерам не нужно беспокоиться об этом - также при вызове нескольких сервисов с одного контроллера.
Проблема заключается в том, что все другие сервисы не могут получить доступ к этому методу сейчас, если они не авторизованы.Однако есть некоторые потоки (например, планировщики), которые в определенный момент вызывают этот метод, не имея готового объекта Authentication
.В некоторых случаях, если это тот же поток, SecurityContext
также возвратит текущую аутентификацию.
Теперь, как реорганизовать эту логику, чтобы другие внутренние потоки вызывали метод без авторизации.Требуется ли изменение дизайна, возможно, второй класс-обертка, такой как SomeService
(без авторизации) и SomeClientService
(с авторизацией)?Другой возможностью было бы получить прямой доступ к репозиториям.