【问题标题】:Disable Remember-Me in Spring Security & Tomcat在 Spring Security 和 Tomcat 中禁用 Remember-Me
【发布时间】:2012-04-21 17:21:04
【问题描述】:

我想知道,有没有办法在 Spring Security 中禁用记住我? 我想要实现的场景很常见:关闭浏览器窗口后,我希望用户的会话过期。看起来很奇怪,但它不适用于 Tomcat 7 和 Spring Security 3.1。 我们在 Spring Security 配置文件中使用了 auto-config,但是没有 remember-me 元素。

让它发挥作用的最佳解决方案是什么?提前致谢!

更新这是澄清我的问题的使用场景:

  1. 用户登录到受限区域,例如 /secure.html
  2. 然后他关闭浏览器而不手动注销。
  3. 他再次打开浏览器并直接转到 /secure.html。
  4. 当前 Spring 的行为:页面显示成功。预期行为:重定向到登录页面。

新症状用于鉴别诊断: 用户很可能重新认证,因为浏览器关闭/打开之间的 JSESSIONID 相同。如何让 Tomcat 或 Spring 为每个浏览器会话生成一个新会话?

更新 Spring Security 配置片段:

<http auto-config="true">
    <anonymous key="anonymous-security" />
    <intercept-url pattern="/auth/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/**" access="ROLE_ADMIN" />
    <form-login login-page="/auth/login.html" 
                default-target-url="/auth/default.html"
                authentication-failure-url="/auth/failed.html" />
    <logout logout-success-url="/auth/logout.html" delete-cookies="JSESSIONID" />
</http>

更新文档 claims 自 3.0 以来 auto-config="true" 中没有默认的 remember-me 配置(我们使用 3.1):

在 3.0 之前的版本中,此列表还包括 remember-me 功能。这可能会导致一些令人困惑的错误 配置并在 3.0 中被删除。

我的网络应用出了什么问题?

【问题讨论】:

  • remember-me cookie 设置了吗?
  • @artplastika:我可能误解了你的问题,如果不是你可能对我在下面提供的答案很感兴趣

标签: java spring session tomcat spring-mvc


【解决方案1】:

您为什么不通过重定向到 /j_spring_security_logout 来注销现有用户?

【讨论】:

  • 我认为它是一种可能的解决方案,但是我需要将用户的会话 ID 存储在我的数据库中的某处,例如。那我为什么需要 Spring Security?
  • 我不清楚您到底需要做什么以及为什么需要在用户注销后存储用户的会话 ID。能详细描述一下吗?
  • 如果我要手动重定向到注销,那么我需要确定会话到期的那一刻。例如,用户登录安全区域,然后关闭浏览器,然后重新打开浏览器并打开安全区域。我什么时候应该注销他?我想至少一步(他的 JSESSIONID 将与关闭浏览器之前的 ID 不同)。
【解决方案2】:

在我使用最新的 Spring 安全性和 Tomcat 6 的实现中,我使用以下配置:它与您的相似吗?

<http use-expressions="true" access-denied-page="/Error.xhtml">
    <intercept-url access="isAuthenticated()" pattern="/secure.xhtml"/>               
    <form-login />
    <logout invalidate-session="true" logout-success-url="/search.xhtml"/>
</http>

【讨论】:

  • 我已将我的配置片段添加到问题中。和你的很接近,添加 invalidate-session="true" 没有效果。
【解决方案3】:

您可以尝试添加logouthandler 来终止本地会话:

<!-- Logout handler terminating local session -->
<bean id="logoutHandler" class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler">
    <property name="invalidateHttpSession" value="true" />
</bean>

实际上它默认为 true,因此您可能不需要设置该属性。

【讨论】:

  • 手动定义注销处理程序 bean 与在我的配置中具有 元素相同。正如我上面提到的,它不会生效。这是合理的,因为这个过滤器会在用户自己注销时获得控制。如果底层浏览器会话发生变化,我需要自动使会话无效。
  • 是的,是的。我想知道浏览器是否正在显示页面的缓存版本,而您正在看到一个副本,或者是否有浏览器实例挂在附近。似乎你所拥有的应该工作。听起来您正在同一个浏览器会话中重新进行身份验证。您应该能够检查会话 id 以查看它们是否已更改或在打开和关闭之间持续存在。
  • > 您应该能够检查会话 ID 以查看它们是否已更改或在打开和关闭之间持续存在——您是对的,会话 ID 是相同的。任何想法为什么以及如何解决这个问题?
  • 这很奇怪。你可能想看看Tomcat。在 Tomcat 7 中,jsession ID 应该在身份验证后立即失效,因为他们会在幕后立即更改它。如果您没有使用特定于 servlet 3 的部署,您应该检查是否在 Tomcat 6 上获得相同的行为。Tomcat 7 中最大的变化之一是安全模型的改进。从技术上讲,会话 ID 应该在浏览器死机时自动清除。此外,您可能需要检查不同的浏览器,看看是否是跨浏览器问题。
【解决方案4】:

问题说明:

我遇到了同样的问题:我的浏览器会记住我的用户。

通常情况下:登录访问受限区域后,关闭浏览器,然后重新打开它并进入相同的受限区域,当我预期会提示我输入凭据时,它将允许我访问它。

玩了之后,我注意到一件重要的事情:这种行为在不同浏览器之间并不一致

  • Eclipse 的底层浏览器在关闭后确实记得
  • Chrome 关闭后确实记得
  • IE (9) 关闭后不记得了
  • Firefox (16.0.1) 关闭后不记得了
  • Safari(5.1.7 for windows)关闭后不记得了

可以测试更多浏览器类型和版本...

解决方案:

  1. 一种解决方法可能是尝试检测用户何时关闭其浏览器,并在发生这种情况时触发注销。不过不太确定这是否可行。

可能有更好的解决方案,如果我找到它,我会更新这个答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 2013-12-23
    • 2019-06-10
    • 2014-02-03
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    相关资源
    最近更新 更多