我有一个使用grails
spring security 2.0.RC-5插件的Grails应用程序.
假设我打开了2个标签.
一旦我退出应用程序,就会在第一天.然后,在第二个,我单击一个按钮,对应用程序进行AJAX调用.
因为我已经注销,所以入口点将是LoginController.authAjax.
此方法中插件生成的默认代码是
response.setHeader 'Location', SpringSecurityUtils.securityConfig.auth.ajaxLoginFormUrl
response.sendError HttpServletResponse.SC_UNAUTHORIZED
我在我的ajax电话上得到了401,没关系.
问题来了,现在如果我回到登录页面并重新提交登录表单,我会被重定向到LoginController.authAjax方法.
这个方法中的代码是
render([success: true, username: springSecurityService.authentication.name] as JSON)
反过来,这不会将我重定向到应用程序中的仪表板页面,而是呈现
{ “成功”:真正的 “用户名”: “USER1”}
显然,这不是预期的行为.我该如何解决?
谢谢
最佳答案 这是Spring Security Core插件的默认行为,当您注销并尝试访问受保护的URL时,它会将该URL存储到会话中,并在成功登录后重定向回到您的同一URL,以便用户不会必须手动转到原始请求的页面.
如果要永久禁用此行为,可以在Config.groovy中指定以下配置:
grails.plugin.springsecurity.successHandler.alwaysUseDefault = true
在这里看到它http://grails-plugins.github.io/grails-spring-security-core/guide/urlProperties.html
但是如果你想要有条件地禁用它,你也可以通过清除上面提到的会话变量来做到这一点:
在您的authAjax操作中:
def authAjax() {
if (request.xhr) { // For any AJAX request or any condition you want
session["SPRING_SECURITY_SAVED_REQUEST"] = null
}
}