何时将主体和凭证注入SecurityContextHolder

时间:2017-12-21 18:22:47

标签: java spring spring-security

SecurityContextHolder是一个方便的类,可以保存静态安全上下文值。但是我发现当我处理自定义(不同类型,如BASE,LDAP或只是表单)时,有时主体或凭证可能为空。因此,通常想知道在用户通过身份验证后,用户主体或凭证对象注入SecurityContextHolder的通用类或模块是什么。

这样用户信息可以参考

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

1 个答案:

答案 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