gpt4 book ai didi

spring - Spring Security 如何在概念上获得当前登录用户?

转载 作者:行者123 更新时间:2023-12-04 17:50:11 25 4
gpt4 key购买 nike

我通过以下方式获取当前登录的用户SecurityContextHolder.getContext().getAuthentication()在服务器端并登录用户。

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

感谢您的回复。

最佳答案

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

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

  • 认证后对应 SecurityContext对象存储在 HTTP session 中。
    每次请求处理前专用 SecurityContextPersistenceFilter被解雇。它负责加载 SecurityContext来自 HTTP session 的对象(通过 SecurityContextRepository 实例)并用于注入(inject) SecurityContext对象进入 SecurityContextHolder .看看 SecurityContextPersistenceFilter的源码类(class)了解更多详情。另一个重要的部分是默认情况下 SecurityContextHolder专卖店 SecurityContext对象使用 ThreadLocal变量(因此每个线程都有不同的身份验证对象)。

    编辑。 附加问题:
  • HTTP session 保存在客户端的浏览器中,并在请求之间更新。不,HTTP session 存储在服务器端。它通过 session cookie 链接到某个用户(浏览器在每次请求期间发送此 cookie)。
  • SecurityContext、SecurityContextHolder 和 SecurityContextRepository 是 Server 端的实例。它们用于服务器端。但是SecurityContextHolder不是实例,它是具有静态方法的辅助类。
  • ThreadLocal 是一个存储SecurityContextHolder 的变量,它存储SecurityContext No, SecurityContext存储在 ThreadLocal多变的。 SecurityContextHolder是一个辅助类,可用于获取/设置 SecurityContext实例通过 ThreadLocal多变的。
  • 如果有 3 个连接,那么 Server 中就会有 3 个 SecurityContext 对象。是的。
  • 一个SecurityContextHolder 存储一个SecurityContext No,同SecurityContextHolder的静态方法被所有线程用来获取/设置对应 SecurityContext .
  • 并且假设服务器端有三个 SecurityContext 实例,它怎么知道哪一个引用了对应的客户端呢? ThreadLocal变量对于不同的线程有不同的值。
  • 关于spring - Spring Security 如何在概念上获得当前登录用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18330677/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com