【问题标题】:Spring security: activating csrf disables /logoutSpring security:激活 csrf 禁用 /logout
【发布时间】:2020-05-09 15:28:38
【问题描述】:

我正在尝试启用 csrf 保护,但仅适用于登录页面。 我添加了以下spring安全配置(<http>标签已经存在)

<http ... >
  <sec:csrf request-matcher-ref="myBean" />
  ...
</http>

<bean id="myBean" class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
  <constructor-arg name="pattern" value="/login"/>
  <constructor-arg name="httpMethod" value="POST"/>
</bean>

登录页面现在确实有 csrf 保护。但是由于一个奇怪的原因,/logout 现在给出了 404 错误。事实上,如果我将/login 替换为/foobar,我在/logout 上仍然会出现404 错误。但是如果我在&lt;sec:csrf/&gt; 标签中添加disabled="true",它会再次起作用。

知道为什么吗?

谢谢

【问题讨论】:

    标签: java spring spring-security csrf


    【解决方案1】:

    如果启用了 csrf,则 POST 请求会执行注销,如本问题所述。也许这个 (Logout is not working in Spring Security) 可以提供帮助。

    在https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#servlet-considerations-csrf-logout 据说:

    如果启用 CSRF 保护(默认),Spring Security 的 LogoutFilter 将只处理 HTTP POST。这可确保注销需要 CSRF 令牌,并且恶意用户无法强制注销您的用户。 最简单的方法是使用表单注销。如果你真的想要一个链接,你可以使用 JavaScript 让链接执行 POST(即可能在隐藏表单上)。对于禁用了 JavaScript 的浏览器,您可以选择让该链接将用户带到将执行 POST 的注销确认页面。

    本节还解释了如何执行 HTTP GET 请求注销,虽然一般不推荐。

    【讨论】:

      猜你喜欢
      • 2020-12-02
      • 2018-12-12
      • 2014-04-26
      • 2015-09-27
      • 2021-05-06
      • 2016-07-21
      • 2020-11-21
      • 2016-03-13
      相关资源
      最近更新 更多