当前位置: 首页 > 知识库问答 >
问题:

如何阻止Spring Security创建新会话?

松俊美
2023-03-14
  1. 我重新启动服务器和浏览器,因此没有会话数据
  2. 我去www.someurl。com公共访问页。我的控制器用这个HttpSession session=request给我一个会话。getSession(true) <李>
  3. 我点击一个指向www.someurl的平面锚链接。在新选项卡中打开的com/admin受限访问页面。Spring Security 3拦截了这一点,并对凭据提出了挑战。我成功登录
  4. 我返回到上一个带有www.someurl的选项卡。com并刷新页面

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

  1. 重新启动浏览器和服务器,以便不存在会话数据
  2. 我去www.someurl.com.控制器已经注入了请求。request.session为空。get会话(true)给我一个id为87B091B12F38D44C53AF0DA9E2147484的会话。LogService获取请求对象,也做get会话(true),但获取id为87B091B12F38D44C53AF0DA9E2147484的会话,所以到目前为止一切都很好。
  3. 我单击 /admin.页面在新选项卡中打开。我登录。
  4. 我刷新www.someurl.com.控制器已注入请求。request.session不为空。会话ID为547DF59035C91783D783BAEF4A15FBFF。

共有2个答案

邬承悦
2023-03-14

您需要更改HttpSessionRequestCache的行为,以便在会话不存在时不会创建会话。

您可以通过在XML配置中创建其实例来实现这一点,如下所示:

<beans:bean id="httpSessionRequestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache"> 
    <beans:property name="createSessionAllowed" value="false" /> 
</beans:bean>

然后,您需要在Spring Security配置中配置超文本传输协议元素以使用您的bean实例:

<http auto-config="true" ....> 
    <request-cache ref="httpSessionRequestCache"/> 
    ... rest of your config
</http>

如果您使用的是JSP,还应该防止JSP创建会话。为了做到这一点,您需要在每个JSP(甚至是其他JSP中包含的JSP)的顶部添加一个页面指令。

<%@ page session="false" %>
夏建弼
2023-03-14

你的诊断错了:

我在控制器中注意到www.someurl.com的是,步骤2和步骤4的会话ID不同。看起来Spring Security创建了一个新会话,并且该会话现在附加到公共页面的请求中。

正是因为所有页面都使用相同的会话,所以当您返回到第一个选项卡并刷新时,您仍然以管理员身份登录。给定浏览器的所有选项卡和框架共享给定webapp的相同会话。这就是它的工作原理。服务器不知道也不关心浏览器选项卡。它获取连接到给定浏览器发送的所有请求的会话cookie,并使用此cookie获取相应的会话。这实际上是一件好事。如果没有这一点,每次打开一个已经通过身份验证的新选项卡时,都必须再次进行身份验证。你肯定不想这样。

因此,让我们解释一下在您的场景中会发生什么:

  1. 您重新启动服务器和浏览器,因此没有会话数据。
  2. 你进入www.someurl.com公共访问页面。你的控制器给你一个会话。一个cookie被发送回浏览器
  3. 您单击平面锚链接,www.someurl.com/admin受限访问页面,该页面在新选项卡中打开。cookie与请求一起发送,因此此请求是在步骤2中打开的会话的一部分。Spring Security 3拦截此内容并挑战凭据。它将凭据附加到会话,现在是经过身份验证的会话
  4. 你用www.someurl.com回到上一个选项卡并刷新页面。cookie再次发送,Spring知道你是在第3步进行身份验证的人,因为身份验证凭据存储在会话中。

编辑:看来我错了,Spring确实在登录后创建了一个新会话,以防止会话固定攻击。文档中提供了关于这一点有用的原因以及如何避免这种行为的解释:

会话固定攻击是一种潜在风险,恶意攻击者可能通过访问站点创建会话,然后说服其他用户使用同一会话登录(例如,通过向他们发送包含会话标识符的链接作为参数)。Spring Security通过在用户登录时创建新会话来自动防止这种情况。如果不需要此保护,或与其他要求冲突,则可以使用上的会话固定保护属性来控制行为,该属性有三个选项

>

  • migrateSession-创建新会话,并将现有会话属性复制到新会话。这是默认设置。

    无-什么都不要做。原始会话将保留。

    newSession-创建一个新的“干净”会话,而不复制现有会话数据。

  •  类似资料:
    • 我正在使用spring-boot 2.3.9和spring-security以及keycloak 12.0.4。 和我的服务bean创建配置 编辑:这可能与Spring-Cloud-Starter-Sleuth有关。如果我移除这个依赖关系,所有的事情就会像预期的那样工作。但我也需要侦探。

    • 收到通知后,我启动一个活动,加载一个webview。它第一次运行良好,但当我第二次收到通知时,它会在现有的webview上打开一个新的webview。 我希望能够把活动放在前面,而不是创建一个新的网络视图,因为页面已经在后台打开了。 处理通知的函数: 我的网络视图活动: 我尝试使用webview的SaveInstanceState和restoreState,但没有成功。

    • 问题内容: 我创建了一个社交网站,其中包含三个简单的表格,如下所示。 用户可以阻止任何他们想要的人,并且如果发生阻止,两个用户将不再在他们的新供稿中看到彼此的帖子。 在我的表中,这意味着并且不会看到彼此的帖子,但是“ user3”通常会看到每个人的帖子,因为他不属于该表格块。 从SQL查询中user1无法看到user2的帖子, 但是user2仍然可以看到user1的帖子, 这是我不想要的。我可以针

    • 问题内容: 我有下一个代码: par.go 我用next运行它: 然后,确认此过程中有多少个线程: 您可以看到有5个线程。 如果我更改in代码的值,那么接下来的情况是: 我知道,去调度的后续机型,在这里,所以,是有(内核线程)。如果任何goroutine处于任何阻塞状态,则它们将从current脱离,并找到一个空闲的或新的if(如果找不到)。 所以,我的问题是:真的在阻止goroutine吗?如果

    • org.openqa.selenium.SessionNotCreatedException:无法创建新会话。(原始错误:命令失败:C:\Windows\system32\cmd.exe/s/C“C:\Program Files(x86)\Android\Android sdk\platform tools\adb.exe”-s 69c7aa170104安装“C:\Program Files(x8