SecurityContextHolder
是一个方便的类,可以保存静态安全上下文值。但是我发现当我处理自定义(不同类型,如BASE,LDAP或只是表单)时,有时主体或凭证可能为空。因此,通常想知道在用户通过身份验证后,用户主体或凭证对象注入SecurityContextHolder
的通用类或模块是什么。
这样用户信息可以参考
User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal()
答案 0 :(得分:1)
根据spring文档用户凭据,用于存储在ThreadLocal中的SecurityContextHolder内的身份验证类中。
SecurityContextHolder使用的基础SecurityContextHolderStrategy默认情况下是ThreadLocalSecurityContextHolderStrategy的一个实例,它将SecurityContexts存储在ThreadLocal中。因此,在初始化时将SecurityContext直接注入bean不一定是个好主意 - 每次都需要在多线程环境中从ThreadLocal中检索它,以便检索正确的。
您可以在访问userDetails
之前检查代码Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
String username = ((UserDetails)principal).getUsername();
} else {
String username = principal.toString();
}
https://docs.spring.io/spring-security/site/docs/3.0.x/reference/technical-overview.html