【问题标题】:Spring security logout after session timeout会话超时后的 Spring 安全注销
【发布时间】:2023-03-31 15:21:01
【问题描述】:

我在会话超时后退出应用程序时遇到问题。我已经配置了注销网址:

<security:logout logout-url="/logout" logout-success-url="/" delete-cookies="JESSIONID"/>

我有注销表格:

<form action="#" th:action="@{/logout}" method="POST">
    <input type="submit" th:value="#{btn.logout}"/>
</form>

表单标签添加了 csrf 参数,只要会话仍然处于活动状态,注销就可以正常工作。但是如果我登录应用程序,让它打开足够长的时间让会话过期,然后点击注销按钮,我会收到错误消息: HTTP 状态 405 - 不支持请求方法“POST”

我仍然希望保留 csrf 验证并使其作为 POST 请求工作。

【问题讨论】:

  • 我不明白为什么你的注销表单有method="post"?
  • spring security 需要POST by default if csrf is enabled。如果您需要 GET 注销支持,请参阅 Rob 的答案:stackoverflow.com/a/20356111/2264997
  • 我知道我可以禁用 csrf 并使其成为 GET,但如果可以的话,我仍然希望将其作为 POST 工作
  • 很抱歉投票结束。我认为您无法在您的情况下避免 405 - 一旦会话到期,csrf 令牌也会到期。正如文档指出的那样,您必须添加某种类型的 js 以在会话超时之前提示用户。

标签: spring spring-mvc spring-security


【解决方案1】:

我在文档中找到了解决方案: 在您的 spring 安全配置中,您必须添加以下行:

<session-management invalid-session-url="/login" />

一个例子:

<form-login
    login-page="/login"
    default-target-url="/"
    authentication-failure-url="/login?error"
    username-parameter="username"
    password-parameter="password" />

<session-management invalid-session-url="/login" />

<form-login login-processing-url="/login" login-page="/login"/>
<logout logout-success-url="/" logout-url="/logout"/>

希望对你有帮助。

【讨论】:

    【解决方案2】:

    在会话到期后设置刷新 HTTP 标头。这将导致页面在会话到期后重新加载,基本上将您注销。

    【讨论】:

      【解决方案3】:

      这是由于会话到期时,登录表单的 csrf 令牌不再有效。并且使用 invalid csrf token 发出 post 请求会导致 spring 给出 405 即 Method Not Supported Error。

      解决方案:

      在Http安全配置中添加如下配置。

      对于 Java 配置:

      .and().sessionManagement().invalidSessionUrl("/login")

      对于 XML 配置:

      &gt; &lt;session-management invalid-session-url="/login" /&gt;

      【讨论】:

        猜你喜欢
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 2018-08-10
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        相关资源
        最近更新 更多