线程中的 spring 安全当前用户

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 用户,这将要求线程中的当前用户并且会失败,因为这将为当前用户提供空值

Ram*_*n R 5

如果您希望生成的线程继承SecurityContext父线程,则应设置MODE_INHERITABLETHREADLOCAL策略。

SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL)

将其与线程池一起使用时出现问题。这似乎是固定的。


小智 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