为什么Spring postOnly会因Logout工作而错误?

时间:2015-09-03 01:57:48

标签: grails spring-security

postOnly在以下属性中的含义

grails.plugin.springsecurity.logout.postOnly=false? 

为什么Logout工作会出错?尝试使注销功能正常工作。但它没有用。造假的原因是什么?

4 个答案:

答案 0 :(得分:3)

首先,请阅读插件文档 - 2.x文档为here,3.x文档为here

该插件默认需要POST请求注销,但使用您引用的配置设置,您可以通过允许GET或POST请求使您的应用程序使用更方便,但安全性更低。

GET请求(例如常规链接)应该用于读取数据的操作。严格的REST API要求GET请求是只读的并且也是幂等的,但显然在常规Web应用程序中这太严格了。但一般来说,最好使用链接和GET请求来请求信息,以及POST / PUT / DELETE /等。请求进行更改。

如果您包含使用GET发出请求的注销链接,则使用XSS或类似攻击的人可能会欺骗您的浏览器将您注销。这不是一个严重的漏洞,并且要求POST不会使攻击者更加困难,但它确实提高了标准。

使用默认配置,您需要做的就是使用一个简单的表单替换注销链接,该表单POST到同一个URL(如果需要,您可以选择使用CSS来设置提交按钮的样式,如果您想要)。如果您对允许用户使用GET请求注销感到满意,请将设置更改为false,并且对该URL的任何请求都将起作用。

答案 1 :(得分:0)

一旦你将其变为现实

grails.plugin.springsecurity.logout.postOnly=true

请求方法类型应仅为POST,即您不能使用GET方法。 因此,在这种情况下,请将注销调用更改为POST类型。

您还可以查看How to customize Grails Spring Security Core 2 login / logout controller and views?

答案 2 :(得分:0)

默认情况下,Spring Security要求注销使用POST请求来提供CSRF protection。有关CSRF的更多信息,请参阅Wikipedia

答案 3 :(得分:0)

  

postOnly在以下属性中的含义

我的意思是,如果您向注销网址发送POST请求,Grails将仅注销用户。

  

为什么Logout工作会出错?

它主要用于CSRF保护。

  

最佳做法是在任何操作上使用HTTP POST   改变状态(即注销)以防止CSRF攻击。如果你   真的想使用HTTP GET,你可以使用logoutRequestMatcher(new   AntPathRequestMatcher(logoutUrl," GET"));

此外,像Chrome这样的现代浏览器会在用户尝试访问 之前 在页面中预加载链接以使其快速生成。这意味着如果您使您的注销链接接受GET请求,即使您不想,Chrome也可能会将您注销。