嗨,我在线程范围内使用 Spring Security 时遇到了一些问题
System.out.println(((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId());
new Thread(() -> System.out.println(((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId())).start();
这两行应该给我当前的用户 ID
第一行按预期工作
第二行给我 NullPointerException 因为没有当前用户它是空值
我发现了这个问题,因为我想将许多行保存到歌曲表中,并且它包含 @CreatedBy 用户,这将要求线程中的当前用户并且会失败,因为这将为当前用户提供空值
最佳答案
如果你想让生成的线程继承父线程的 SecurityContext
,你应该设置 MODE_INHERITABLETHREADLOCAL
策略。SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL)
有一个 issue ,当它与线程池一起使用时。这似乎是固定的。
关于线程中的 spring 安全当前用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42341635/