Grails 使用 spring-security-core-3.0.6 重定向注销后
在 Spring Security 版本 3.0.6 中,修复了 CRLF 注销漏洞(https://jira.springsource.org/browse/SEC -1790)他们禁用了“spring-security-redirect”参数的使用。
还默认支持注销 URL 中的重定向参数 在 3.0.6 中被删除。在 3.1 中已经需要启用 明确地。
有没有办法重新打开重定向参数,以便我可以在 Grails Spring Security 注销控制器中动态重定向?
LogoutContoller.groovy
def user = springSecurityService.currentUser
if (params.redirect) {
// this needs to log the user out and then redirect, so don't redirect until we log the user out here
log.info "Redirecting " + springSecurityService.currentUser.username + " to " + params.redirect
// the successHandler.targetUrlParameter is spring-security-redirect, which should redirect after successfully logging the user out
redirect uri: SpringSecurityUtils.securityConfig.logout.filterProcessesUrl + "?spring-security-redirect="+params.redirect
return;
}
redirect uri: SpringSecurityUtils.securityConfig.logout.filterProcessesUrl // '/j_spring_security_logout'
以下内容不再适用于 spring security 3.0.6+ 的版本
In spring security version 3.0.6, which fixed a CRLF logout exploit (https://jira.springsource.org/browse/SEC-1790) they disabled the use of the 'spring-security-redirect' parameter.
Default support for the redirect parameter in logout URLs has also
been removed in 3.0.6. In 3.1 it already needs to be enabled
explicitly.
Is there a way to turn the redirect parameter back on, so that I can dynamically redirect in my Grails Spring Security Logout Controller?
LogoutContoller.groovy
def user = springSecurityService.currentUser
if (params.redirect) {
// this needs to log the user out and then redirect, so don't redirect until we log the user out here
log.info "Redirecting " + springSecurityService.currentUser.username + " to " + params.redirect
// the successHandler.targetUrlParameter is spring-security-redirect, which should redirect after successfully logging the user out
redirect uri: SpringSecurityUtils.securityConfig.logout.filterProcessesUrl + "?spring-security-redirect="+params.redirect
return;
}
redirect uri: SpringSecurityUtils.securityConfig.logout.filterProcessesUrl // '/j_spring_security_logout'
The following no longer works for versions of spring security 3.0.6+
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以以编程方式注销并在控制器的操作中进行手动重定向:
You can logout programmatically and do manual redirect in a action of controller:
这是一个非常专业的主题,这里是研究的解决方案:
这是删除重定向的 3.0.x 提交: http://git.springsource.org/spring-security/spring-security/commit/a087e828a63edf0932e4eecf174cf816cbe6a58a
基本思想是,他们通过删除默认 LogoutSuccessHandler bean 来删除处理重定向的能力targetUrlParameter(将其设置为 null 会导致不会发生重定向)。
因此问题的解决方案是
1) 创建一个简单的 LogoutSuccessHandler bean,不将 targetUrlParameter 设置为 null:
并且
2) 在resources.groovy 中注册此bean:
默认行为是允许发生注销重定向。
It is a pretty specialized topic, here is the researched solution:
Here is the 3.0.x commit that removed the redirection: http://git.springsource.org/spring-security/spring-security/commit/a087e828a63edf0932e4eecf174cf816cbe6a58a
The basic idea is that they removed the ability for the default LogoutSuccessHandler bean to handle redirects by removing the targetUrlParameter (setting it to null causes no redirects to happen).
Thus the solution to the problem is to
1) Create a simple LogoutSuccessHandler bean that does not set the targetUrlParameter to null:
And
2) Register this bean in
resources.groovy
:And the default behavior is to allow for the logout redirects to happen.