Spring Security如何获取当前登录用户的概念?

Wil*_*LAM 5 security spring spring-security

SecurityContextHolder.getContext().getAuthentication()在服务器端获取当前登录的用户 并对用户进行一些登录.

这是一个问题:假设我有三个用户登录.服务器端如何识别用户只是简单地调用SecurityContextHolder.getContext().getAuthentication();

感谢您的回复.

Mak*_*das 8

默认情况下,这里有3个重要的事项:

  • HTTP会话 - 在请求之间存储身份验证对象
  • Servlet API过滤器 - SecurityContextHolder在来自HTTP会话的每个请求之前填充(并在请求完成后将认证对象存储回来)
  • ThreadLocal - 在请求处理期间存储认证对象

认证后,相应的SecurityContext对象存储在HTTP会话中.在每个请求处理特殊之前SecurityContextPersistenceFilter触发.它负责SecurityContext从HTTP会话(通过SecurityContextRepository实例)加载对象以及将SecurityContext对象注入SecurityContextHolder.查看SecurityContextPersistenceFilter类的源代码以获取更多详细信息.另一个重要的部分是默认情况下使用变量SecurityContextHolder存储SecurityContext对象ThreadLocal(因此每个线程将有一个不同的身份验证对象).

编辑.其他问题:

  1. HTTP会话保存在客户端的浏览器中,并在请求之间进行更新.不,HTTP会话存储在服务器端.它通过会话coockie链接到某些用户(浏览器在每个请求期间发送此cookie).
  2. SecurityContext,SecurityContextHolder和SecurityContextRepository是服务器端的实例.它们用于服务器端.但SecurityContextHolder它不是一个实例,它是一个带有静态方法的辅助类.
  3. ThreadLocal是一个存储SecurityContextHolder的变量,它存储SecurityContext No,SecurityContext存储在ThreadLocal变量中.SecurityContextHolder是一个辅助类,可用于SecurityContext通过ThreadLocal变量获取/设置实例.
  4. 如果有三个连接,那么Server中将有三个SecurityContext对象.是的.
  5. 一个SecurityContextHolder存储一个SecurityContext No,SecurityContextHolder所有线程使用的相同静态方法来获取/设置相应的 SecurityContext.
  6. 假设服务器端有三个SecurityContext实例,它如何知道哪一个引用相应的客户端? ThreadLocal变量对于不同的线程具有不同的值.