gpt4 book ai didi

jquery - Spring Security Core authAjax,如何忽略 Referer

转载 作者:行者123 更新时间:2023-12-01 00:08:24 32 4
gpt4 key购买 nike

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

def authAjax = {
response.setHeader 'Location', SpringSecurityUtils.securityConfig.auth.ajaxLoginFormUrl
response.sendError HttpServletResponse.SC_UNAUTHORIZED
}

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

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

登录表单是直接来自插件文档的标准登录表单。唯一的区别是我使用 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');

问题是,第一次单击登录按钮时,我似乎验证正常,但从服务器返回的响应是基于 Referer 请求 header 的 302 重定向。所以我的 $.post() 的主体永远不会运行。我得到的是 HTML 而不是 JSON。直到第二次提交之前,它实际上并没有命中我的 LoginController.ajaxSuccess 方法。我已经阅读并重新阅读了文档,我一定错过了一些东西。

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

最佳答案

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

我相信 LoginController.ajaxSuccess 只有在没有 SavedRequest 重定向到已安装的情况下才会被命中,因此您返回的 HTML 应该是原始请求的结果,该请求当时未经授权。因此,技巧是您希望使用用于处理原始请求的任何函数作为 #ajaxLoginForm 提交的成功方法。

关于jquery - Spring Security Core authAjax,如何忽略 Referer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5628199/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com