Spring Security Core authAjax,如何忽略Referer

Gre*_*egg 4 authentication ajax jquery grails spring-security

我正在使用Grails 1.3.7和最新的spring-security-core插件.我在LoginController中实现了以下方法:

def authAjax = {
   response.setHeader 'Location', SpringSecurityUtils.securityConfig.auth.ajaxLoginFormUrl
   response.sendError HttpServletResponse.SC_UNAUTHORIZED
}
Run Code Online (Sandbox Code Playgroud)

在我的全局JavaScript文件中,我有以下内容:

$.ajaxSetup({
   error: function(xhr, status, err) {
      if (xhr.status == 401) {
         // display a login form in a dialog
      }
   }
});
Run Code Online (Sandbox Code Playgroud)

登录表单是直接来自插件文档的标准登录表单.唯一的区别是我使用jQuery提交表单,如下所示:

var params = $('#ajaxLoginForm').serialize();
$.post($('#ajaxLoginForm').attr('action'), params, function(jsonData) {
   if (jsonData.success) {
      $('#login-dialog').dialog('close');
   } else {
      alert('TODO: display errors');
   }
}, 'json');
Run Code Online (Sandbox Code Playgroud)

问题是,当我第一次单击登录按钮时,我似乎正在验证确定,但是从服务器返回的响应是基于Referer请求标头的302重定向.所以$ .post()的主体永远不会被运行.我正在获取HTML而不是JSON.它实际上并没有在第二次提交之前点击我的LoginController.ajaxSuccess方法.我已阅读并重新阅读文档,但我必须遗漏一些内容.

更新:看起来它可能不是Referer问题,因为第二次发布表单时,Referer仍然存在.所以我完全不知道为什么我必须两次提交表单才能调用ajaxSuccess方法.

小智 6

当您进行未经授权的访问受保护资源的尝试时,Spring Security会在您的会话中保存该请求(http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/web/savedrequest /DefaultSavedRequest.html),然后当您成功进行身份验证时,它会将您重定向到该请求.您可以使用Spring Security配置全面关闭此行为,但这可能不是您想要的大多数工作流程.您也可以在authAjax方法中明确地从会话中删除SavedRequest,但同样,这可能不是用户的最佳体验.

我相信如果没有SavedRequest重定向到insted,LoginController.ajaxSuccess只会被点击,所以你要取回的HTML应该是你原始请求的结果,当时这是未经授权的.因此,诀窍在于您希望使用您用于处理原始请求的任何函数作为#ajaxLoginForm提交的成功方法.