5

I get the currently logged in user by SecurityContextHolder.getContext().getAuthentication() in server side and do some logging on users.

Here is the question: Suppose I have three user logged in. How the server side can identify the user just simply calling SecurityContextHolder.getContext().getAuthentication(); ?

Thanks for your reply.

4

2 回答 2

8

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

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

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

编辑。附加问题:

  1. HTTP 会话保存在客户端的浏览器中,并在请求之间更新。不,HTTP 会话存储在服务器端。它通过会话 cookie 链接到某个用户(浏览器在每次请求期间发送此 cookie)。
  2. SecurityContext、SecurityContextHolder 和 SecurityContextRepository 是 Server 端的实例。它们用于服务器端。但SecurityContextHolder不是一个实例,它是一个带有静态方法的辅助类。
  3. ThreadLocal 是存储SecurityContextHolder 的变量,其中存储SecurityContext号,SecurityContext存储在ThreadLocal变量中。SecurityContextHolder是一个帮助类,可用于通过变量获取/设置SecurityContext实例。ThreadLocal
  4. 如果有 3 个连接,那么 Server 中就会有 3 个 SecurityContext 对象。是的。
  5. 一个 SecurityContextHolder 存储一个 SecurityContext No,SecurityContextHolder所有线程用来获取/设置对应 SecurityContext的相同静态方法。
  6. 并且假设服务器端有三个 SecurityContext 实例,它怎么知道哪一个引用了对应的客户端呢? ThreadLocal变量对于不同的线程有不同的值。
于 2013-08-20T08:56:18.750 回答
0

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

于 2013-08-20T08:48:16.390 回答