我需要让当前用户在函数中由可调用对象执行。 用于执行我的可调用对象的方法:
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);
但这显示我无效。
请帮忙。谢谢。
SecurityContextHolder(默认情况下(通过 ThreadLocal 存储 SecurityContext。它仅在处理请求的线程中可用。
在执行它们之前,您必须获取 SecurityContext(在请求线程上(并将其传递给每个 Callable。
Matt 是正确的 RE:Spring 将身份验证存储在线程局部变量中。您也许能够将 Spring 安全性配置为将安全上下文从父线程传递到通过调用生成的上下文:
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
见 https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/core/context/SecurityContextHolder.html