Spring Security: вызов метода по расписанию вручную в контексте по расписанию - PullRequest
0 голосов
/ 04 декабря 2018

Как можно вызвать метод @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 во время разработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...