ash*_*evo 3 spring multithreading spring-security
嗨,我在线程范围内使用 Spring Security 时遇到了一些问题
System.out.println(((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId());
new Thread(() -> System.out.println(((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId())).start();
Run Code Online (Sandbox Code Playgroud)
这两行应该给我当前的用户 ID
第一行按预期工作
第二行给我 NullPointerException 因为没有当前用户它是空值
我发现了这个问题,因为我想将许多行保存到歌曲表中,并且它包含 @CreatedBy 用户,这将要求线程中的当前用户并且会失败,因为这将为当前用户提供空值
小智 5
您可以将 SecurityContext 从一个线程转移到另一个线程
Runnable originalRunnable = new Runnable() {
public void run() {
// invoke secured service
}
};
SecurityContext context = SecurityContextHolder.getContext();
DelegatingSecurityContextRunnable wrappedRunnable =
new DelegatingSecurityContextRunnable(originalRunnable, context);
new Thread(wrappedRunnable).start();
Run Code Online (Sandbox Code Playgroud)
请参阅并发支持
http://docs.spring.io/spring-security/site/docs/current/reference/html/concurrency.html