Java 主体和凭证何时注入SecurityContextHolder

Java 主体和凭证何时注入SecurityContextHolder,java,spring,spring-security,Java,Spring,Spring Security,SecurityContextHolder是一个方便的类,可以保存静态安全上下文值。然而,我发现当我处理定制(不同类型,如BASE、LDAP或just-form)时,有时主体或凭证可能为空。所以,我们只是想知道,在用户经过身份验证后,用户主体或凭证对象被注入到SecurityContextHolder的一般类或模块是什么 以便用户信息可以从 User user = (User)SecurityContextHolder.getContext().getAuthentication().getPr

SecurityContextHolder
是一个方便的类,可以保存静态安全上下文值。然而,我发现当我处理定制(不同类型,如BASE、LDAP或just-form)时,有时主体或凭证可能为空。所以,我们只是想知道,在用户经过身份验证后,用户主体或凭证对象被注入到
SecurityContextHolder
的一般类或模块是什么

以便用户信息可以从

User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal()

根据spring文档,用户凭证用于存储在ThreadLocal中SecurityContextHolder内部的身份验证类中

默认情况下,SecurityContextHolder使用的底层SecurityContextHolderStrategy是ThreadLocalSecurityContextHolderStrategy的一个实例,它将SecurityContexts存储在ThreadLocal中。因此,在初始化时直接将SecurityContext注入bean并不一定是个好主意——在多线程环境中,每次都可能需要从ThreadLocal检索SecurityContext,以便检索正确的

在访问userDetails之前,可以在代码中进行检查

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

    if (principal instanceof UserDetails) {
    String username = ((UserDetails)principal).getUsername();
    } else {
    String username = principal.toString();
    }