ExecutorService с SecurityContextHolder - PullRequest
0 голосов
/ 30 апреля 2020

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

Причина: java .lang.Exception: объект аутентификации не найден в контексте безопасности. на com.LoggedInUser.getLoggedInUser (LoggedInUser. java: 25) на com.Controller.submitRate (RateController. java: 242)

Мой код:

method(){

Future<Results> future = executor.submit(new callableClass(form, request));

            if (null != future.get()) {
                rates = future.get();
            }}
}


class callableClass implements Callable<RateResults> {

    private Form form;
    private HttpServletRequest request;

    public RateShippmentCaller(Form form, HttpServletRequest request) {
        super();
        this.form = form;
        this.request = request;
    }

    @Override
    public Results call() throws Exception {
        return controller.submit(form, request);
    }

}

submit(form, request){
LoggedInUser.getLoggedInUser()
}

class LoggedInUser{
    getLoggedInUser(){
       SecurityContext **secCtx** = SecurityContextHolder.getContext();
        Authentication authentication = secCtx.getAuthentication();
        if (authentication == null) {
            throw new Exception("Authentication object not found in security context.");
        }
    }
}

Пожалуйста, сообщите Я знаю, как избежать исключения. secCtx возвращает ноль.

1 Ответ

1 голос
/ 30 апреля 2020

Попробуйте установить следующую стратегию держателя контекста безопасности:

SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);

Обратите внимание, что вы не должны использовать это, если у вас есть пул потоков, только если каждый раз создается новый поток.

Другой способ передачи контекста:

Runnable runnable = new Runnable() {
    public void run() {
        // you’ll be able to access the context here
    }
};
SecurityContext context = SecurityContextHolder.getContext();
DelegatingSecurityContextRunnable wrappedRunnable =
    new DelegatingSecurityContextRunnable(runnable, context);

new Thread(wrappedRunnable).start();
...