我需要让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);
但这显示我为空。
请任何帮助。谢谢。
答案 0 :(得分:2)
SecurityContextHolder(默认情况下)通过ThreadLocal存储SecurityContext。它仅在处理请求的线程中可用。
在执行它们之前,必须获取SecurityContext(在请求线程上)并将其传递给每个Callable。
答案 1 :(得分:1)
Matt是正确的RE:将身份验证存储在线程局部变量内。您可能可以配置Spring Security,以将安全上下文从父线程传递给通过调用而生成的线程:
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);