何时将主体和凭证注入SecurityContextHolder

问题描述 投票:-1回答:1

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

这样用户信息就可以参考了

User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal()
java spring spring-security
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.