如何在Spring中获得Callable内部的当前用户

时间:2018-06-26 16:18:33

标签: spring spring-boot spring-security callable

我需要让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 :(得分:2)

SecurityContextHolder(默认情况下)通过ThreadLocal存储SecurityContext。它仅在处理请求的线程中可用。

在执行它们之前,必须获取SecurityContext(在请求线程上)并将其传递给每个Callable。

答案 1 :(得分:1)

Matt是正确的RE:将身份验证存储在线程局部变量内。您可能可以配置Spring Security,以将安全上下文从父线程传递给通过调用而生成的线程:

SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);

请参见https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/core/context/SecurityContextHolder.html