SecurityContextHolder线程安全吗?

Dro*_*roo 6 java spring spring-mvc spring-security

我使用SecurityContextHolder和定制UserDetailsService,以获得UserDetails来自SecurityContextHolder:

Object o = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserDetailsDTO user = (UserDetailsDTO) o;
Run Code Online (Sandbox Code Playgroud)

我遗漏了空检查等,但这就是主意.我在一个@Around切入点中使用它@Aspect:

@Around("execution(* user.service.*.*(..))")
public Object audit(ProceedingJoinPoint call) throws Throwable {
     // get user id
     // add audit row in db
}
Run Code Online (Sandbox Code Playgroud)

看一下这个SecurityContextHolder类,它ThreadLocal默认使用一个,但切入点的东西似乎也有某种封装的线程逻辑.

是否可能存在用户冲突(即,在一个会话中为另一个并发会话中的UserB审核事件访问UserA),或者可能是空用户.

有没有更好的方法来获取凭据/用户配置文件?

axt*_*avt 6

是的,使用默认策略(MODE_THREADLOCAL)是线程安全的(只要您不尝试动态更改策略).但是,如果您希望生成的线程继承SecurityContext父线程,则应设置MODE_INHERITABLETHREADLOCAL.

方面也没有任何"线程逻辑",它们在与建议方法相同的线程中执行.