当前位置: 首页 > 面试题库 >

Spring Security的SecurityContextHolder:会话或请求绑定?

徐飞尘
2023-03-14
问题内容

我从中检索到的Userprincipal是否SecurityContextHolder绑定到请求或会话?

UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

这是我访问当前登录用户的方式。如果当前会话被破坏,这将无效吗?


问题答案:

这取决于您如何配置它(或者说,您可以配置其他行为)。

在Web应用程序中,您将使用与ThreadLocalSecurityContextHolderStrategy交互的SecurityContextPersistenceFilter

的Java文档SecurityContextPersistenceFilter以:

在请求之前,使用从已配置的{@link SecurityContextRepository}获取的信息填充{@link
SecurityContextHolder},并在请求完成并清除上下文所有者后将其存储回存储库中。默认情况下,它使用{@link
HttpSessionSecurityContextRepository}。请参阅此类以获取与HttpSession相关的配置选项的信息。

顺便说一句:HttpSessionSecurityContextRepository是SecurityContextRepository的唯一实现(我在默认库中找到了)

它是这样的:

  • HttpSessionSecurityContextRepository用途HttpSession中(密钥=“SPRING_SECURITY_CONTEXT”)来存储一个SecurityContext对象
  • SecurityContextPersistenceFilter是一种使用一个过滤器SecurityContextRepository例如 HttpSessionSecurityContextRepository加载和存储SecurityContext对象。如果HttpRequest通过了过滤器,则过滤器SecurityContext将从存储库中获取并将其放入SecurityContextHolder(SecurityContextHolder#setContext
  • SecurityContextHolder有两个方法setContextgetContext。两者都使用a SecurityContextHolderStrategy来指定在set-和get-Context方法中究竟要执行什么操作。-例如,ThreadLocalSecurityContextHolderStrategy使用本地线程存储上下文。

因此,总而言之:用户主体(SecurityContext的元素)存储在HTTP会话中。对于每个请求,它都放在访问它的本地线程中。



 类似资料:
  • 从WebSocketendpoint,我尝试调用单例服务。但是我无法使用来自WebSocket的请求或会话范围。 谢谢你的帮助!

  • 问题内容: 我想知道是否有一种简单的方法可以从Jade模板中访问Express.js的req或会话变量,而无需通过常规响应传递它。 还是这是唯一的方法? 问题答案: 您需要创建一个Express才能使用。 然后在模板内部,您可以使用或其他任何东西。 注意:Express 3中不推荐使用dynamicHelpers

  • 问题内容: 我有登录功能 此函数用于将变量保存到会话中, 但是当新请求检查用户是否登录时 然后返回总是“注销”,因为会话已更改。我使用Redis来存储会话,我认为这是Redis的错误,因为当我停止使用Redis时,可以,请帮帮我! 问题答案: 最好的处理方式是始终让Express处理它(如果可以的话)。 https://flaviocopes.com/express-sessions/(更新了会话

  • 我一直有一个问题,当请求来自域名而不是localhost时,会话变量不可用。例如,如果我设置一个用户变量: 当客户端发出另一个请求并且我尝试访问用户会话变量时,它返回null。 我注意到,在每个请求中,都会设置一个新的JSESSIONID cookie,并且ID值会更改。这是否意味着每次客户端访问服务器时都会创建一个新会话?如何在客户端之间保持相同的会话,以便我可以在Http会话中存储对象并访问它

  • 问题内容: 我正在使用请求模块(Python 2.5的版本0.10.0)。我已经弄清楚了如何将数据提交到网站上的登录表单并检索会话密钥,但是我看不到在后续请求中使用此会话密钥的明显方法。有人可以在下面的代码中填写省略号还是建议其他方法? 问题答案: 您可以使用以下方法轻松创建持久会话: 之后,请继续执行您的请求: 有关会话的更多信息,请访问:https : //requests.kennethre

  • 在我的ATG应用程序中,当我使用checkFormRedirect将用户重定向到带有一些参数的jsp页面时,我得到的参数为NULL。请参阅下面的FormHandler代码: UserFormHandler: test.jsp: 此外,我尝试在formHandler中使用变量并设置值,但仍然得到的值为NULL。能不能帮点忙。