Создание задачи @Scheduled с разрешениями ROLE_ADMIN в Jhipster - PullRequest
0 голосов
/ 03 июля 2018

Я использую Jhipster 4.14.4

Я пытаюсь создать запланированную задачу @, которая будет выполнять определенные действия, требующие прав администратора.

Проблема в том, что по умолчанию при запуске программы не устанавливается аутентификация в контексте основного потока, если кто-то не входит в систему через сайт (или не вызывает "api / authenticate").

Я ищу безопасный способ передачи полномочий ADMIN_ROLE моему методу @scheduled, чтобы он мог выполнять необходимые действия, но он не будет "просачиваться" в любом случае, о котором я не могу думать другие пользователи.

Мне также нужно, чтобы этот метод был изолирован от любого имени пользователя, которое может установить аутентификацию в контексте основного потока, потому что тогда он не сможет выполнить соответствующую задачу.

На данный момент я изменил класс AsyncConfiguration следующим образом:

  1. реализован интерфейс SchedulingConfigurer:

    @Configuration
    @EnableAsync
    @EnableScheduling
    public class AsyncConfiguration implements AsyncConfigurer, SchedulingConfigurer
    
  2. Добавлен новый bean-компонент «scheduleTaskExecutor» (помимо существующего по умолчанию «taskExecutor»):

    @Bean(name = "scheduledTaskExecutor")
    public Executor scheduledTaskExecutor() {
    
        ScheduledExecutorService delegateExecutor = Executors.newSingleThreadScheduledExecutor();
    
        SecurityContext context = SecurityContextHolder.createEmptyContext();
        Authentication authentication = new UsernamePasswordAuthenticationToken("{admin_username}","{admin_password}");
        context.setAuthentication(authentication);
    
        return new DelegatingSecurityContextScheduledExecutorService(delegateExecutor, context);
    }
    
  3. Переопределите метод ConfigureTasks () интерфейса SchedulingConfigurer и установите новый планировщик, который я создал:

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(scheduledTaskExecutor());
    }
    

В результате возникает ошибка, что необходима полная аутентификация .

org.springframework.security.authentication.InsufficientAuthenticationException: Full authentication is required to access this resource

Затем я попытался внедрить AuthenticationManager и использовать его для создания объекта аутентификации:

Authentication authentication = this.authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("{admin_username}","{admin_password}"));

Но то, что я получил, было:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method liquibase in 
net.myCompany.myApp.config.DatabaseConfiguration required a bean of type 
'org.springframework.core.task.TaskExecutor' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.core.task.TaskExecutor' in your configuration.


Process finished with exit code 0

Буду очень признателен вам за помощь в этом вопросе.

Спасибо!

1 Ответ

0 голосов
/ 03 июля 2018

Вам необходимо включить планирование перед использованием @EnableScheduling, ТАК добавьте это в ваш файл класса конфигурации-

@ EnableScheduling

открытый класс AsyncConfiguration реализует AsyncConfigurer, SchedulingConfigurer

...