我有一个使用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)
反过来,这不会将我重定向到应用程序中的仪表板页面,而是呈现
{"success":true,"username":"user1"}
显然,这不是预期的行为。我该如何解决? 谢谢
答案 0 :(得分:2)
这是 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
}
}