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

时间:2013-08-20 08:43:50

标签: spring security spring-security

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

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

感谢您的回复。

2 个答案:

答案 0 :(得分:8)

默认情况下,这里有三件重要的事情:

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

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

编辑。其他问题:

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

答案 1 :(得分:0)

对于每个logged-in用户,都会有不同的会话。每个session都有自己的配置。因此,在服务器端SecurityContext加载特定于session的数据。您可以将SecurityContext中的数据可视化为map(键值)对。