Как получить текущего пользователя внутри Callable весной - PullRequest
0 голосов
/ 26 июня 2018

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

public static boolean run(List<Callable<Integer>> callables) {
    try {
        ExecutorService executor = Executors.newWorkStealingPool();
        long startTime = System.currentTimeMillis();
        executor.invokeAll(callables);
        long stopTime = System.currentTimeMillis();
        long elapsedTime = stopTime - startTime;
        return true;
    }
    catch (InterruptedException e) {
        e.printStackTrace();
        return false;
    }
}

Внутри вызываемого я вызываю функцию, которая нужна текущему пользователю, я пытаюсь использовать SecurityContextHolder:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
System.out.println("auth" + auth);

Но это покажет мне ноль.

Любая помощь, пожалуйста. Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Мэтт верен RE: Spring хранит аутентификацию внутри локальной переменной потока. Возможно, вы сможете настроить Spring Security для передачи контекста безопасности из родительского потока в тот, который порождается путем вызова:

SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);

См. https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/core/context/SecurityContextHolder.html

0 голосов
/ 27 июня 2018

SecurityContextHolder (по умолчанию) сохраняет SecurityContext через ThreadLocal . Он доступен только в потоке, который обрабатывает запрос.

Вы должны получить SecurityContext (в потоке запроса) и передать его каждому вызываемому элементу, прежде чем выполнять их.

...