Как можно вызвать метод @Scheduled
вручную в «запланированном контексте»?
Ситуация:
У меня есть функция DAO, которая обеспечиваетсяSpring Security с использованием @PostFilter
для возврата только тех объектов, к которым у текущего пользователя есть доступ.
@PostFilter("hasPermission(filterObject, 'READ') or hasRole('ADMIN')")
public List<Car> getAllEntities() {
return ...
}
Я использую эту функцию внутри запланированного задания, используемого для обновления всех автомобилей в базе данных.
@Scheduled(cron = "0 0 1 * * *")
public void updateCars() {
List<Car> cars = carDao.getAllEntities();
System.out.println("Number of cars: " + cars.size());
...
}
Эта функция всегда печатает 0
, поскольку @PostFilter
удаляет все автомобили из списка.Это ожидается, так как запланированная функция вызывается без аутентификации.
Таким образом, я использовал следующий код: https://www.petrikainulainen.net/programming/spring-framework/spring-from-the-trenches-invoking-a-secured-method-from-a-scheduled-job/
...
private SecurityContext createSchedulerSecurityContext() {
SecurityContext context = SecurityContextHolder.createEmptyContext();
Collection<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_ADMIN");
Authentication authentication = new UsernamePasswordAuthenticationToken(
"user",
"password",
authorities
);
context.setAuthentication(authentication);
return context;
}
...
Я реализовал SchedulingConfigurer
(см. 3.2 изссылка) для выполнения запланированных задач с ADMIN
аутентификацией.Это прекрасно работает, и запланированные функции выводят 42
.
Проблема: Для целей отладки и во время разработки я хочу вызвать updateCars()
вручную, чтобы обеспечить актуальностьбаза данных.Просто вызов функции снова печатает 0
, поскольку аутентификация ADMIN
применяется только в запланированном контексте.
Вопрос: Можно ли вручную запустить updateCars()
в запланированном контексте илиЕсть ли лучший способ вызвать функцию как ADMIN
во время разработки.