gpt4 book ai didi

spring - 如何阻止 Spring Security 创建新 session ?

转载 作者:行者123 更新时间:2023-12-02 05:02:58 25 4
gpt4 key购买 nike

场景

  1. 我重新启动了服务器和浏览器,因此没有会​​话数据。
  2. 我访问 www.someurl.com 公共(public)访问页面。我的 Controller 通过此 HttpSession session=request.getSession(true);
  3. 为我获取 session
  4. 我单击了 www.someurl.com/admin 受限访问页面的平面 anchor 链接,该页面在新选项卡中打开。 Spring Security 3 会拦截此行为并对凭证进行质询。我登录成功了。
  5. 我通过 www.someurl.com 返回上一个选项卡并刷新页面。

问题

我在 www.someurl.com 的 Controller 中注意到,步骤 2 和步骤 4 中的 session id 不同。看起来 Spring Security 创建了一个新 session ,并且该 session 现在附加到公共(public)页面的请求中。为什么会发生这种情况?我可以强制 Spring Security 使用现有 session 吗?

追踪场景

  1. 重新启动浏览器和服务器,以便不存在 session 数据。
  2. 我访问 www.someurl.com。 Controller 已注入(inject)请求。 request.session 为空。 getSession(true) 为我获取一个 id 为 87B091B12F38D44C53AF0DA9E2147484 的 session 。 LogService 获取请求对象并执行 getSession(true),但获取 id 为 87B091B12F38D44C53AF0DA9E2147484 的 session ,因此到目前为止一切都很好。
  3. 我点击/admin。页面在新选项卡中打开。我登录了。
  4. 我刷新了 www.someurl.com。 Controller 已注入(inject)请求。 request.session 不为空。 session ID 为 547DF59035C91783D783BAEF4A15FBFF。

最佳答案

您的诊断错误:

What I notice in my controller for www.someurl.com is that the session id is different on step 2 and step 4. Looks like Spring Security created a new session and that session is now attached to the request for public page.

正是因为所有页面都使用相同的 session ,所以当您返回第一个选项卡并刷新时,您仍然以管理员身份登录。给定浏览器的所有选项卡和框架共享给定 Web 应用程序的同一 session 。这就是它的工作原理。服务器不知道也不关心浏览器选项卡。它获取附加到给定浏览器发送的所有请求的 session cookie,并使用此 cookie 获取相应的 session 。这其实是一件好事。否则,每次您在经过身份验证后打开新选项卡时,都必须再次进行身份验证。你肯定不希望这样。

那么让我们解释一下您的场景中会发生什么:

  1. 您重新启动服务器和浏览器,因此没有会​​话数据。
  2. 您访问 www.someurl.com 公共(public)访问页面。您的 Controller 为您提供一个 session 。 cookie 被发送回浏览器
  3. 您单击平面 anchor 链接至 www.someurl.com/admin 受限访问页面,该页面将在新选项卡中打开。 cookie 与请求一起发送,因此该请求是在步骤 2 中打开的 session 的一部分。Spring Security 3 会拦截此请求并询问凭据。它将凭据附加到 session ,该 session 现在是经过身份验证的 session
  4. 您返回到上一个标签页 www.someurl.com 并刷新页面。再次发送 cookie,Spring 就知道您是在第 3 步进行身份验证的人,因为身份验证凭据存储在 session 中。

编辑:看来我错了,Spring确实在登录后创建了一个新 session 以防止 session 固定攻击。有关此功能为何有用以及如何避免此行为的说明,请参阅the documentation。 :

Session fixation attacks are a potential risk where it is possible for a malicious attacker to create a session by accessing a site, then persuade another user to log in with the same session (by sending them a link containing the session identifier as a parameter, for example). Spring Security protects against this automatically by creating a new session when a user logs in. If you don't require this protection, or it conflicts with some other requirement, you can control the behaviour using the session-fixation-protection attribute on , which has three options

  • migrateSession - creates a new session and copies the existing session attributes to the new session. This is the default.

  • none - Don't do anything. The original session will be retained.

  • newSession - Create a new "clean" session, without copying the existing session data.

关于spring - 如何阻止 Spring Security 创建新 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14176853/

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