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提交的成功方法.
| 归档时间: |
|
| 查看次数: |
3556 次 |
| 最近记录: |