【问题标题】:Spring Security 3 SavedRequestAwareAuthenticationSuccessHandler doesn't make difference for POST and GETSpring Security 3 SavedRequestAwareAuthenticationSuccessHandler 对 POST 和 GET 没有影响
【发布时间】:2012-12-10 18:21:55
【问题描述】:

有这样的问题:当使用spring security 3时,尝试询问资源(通过GET)或提交表单(通过POST)而应该登录。所以我重定向到登录表单,然后spring恢复我原来的请求,但是它总是恢复为 GET 请求(即使我尝试发出 POST 请求)。所以我想知道我该如何解决它?或者我怎样才能让 Spring Security 只存储 GET 请求并跳过 POST?

我在 DefaultSavedRequest 中找到了这样的代码:

public boolean doesRequestMatch(HttpServletRequest request, PortResolver portResolver) {

    ...

    if (!"GET".equals(request.getMethod()) && "GET".equals(method)) {
        // A save GET should not match an incoming non-GET method
        return false;
    }

据我了解,此方法比较缓存请求和传入请求,它表明仅当传入请求不是 GET 并且存储请求是 GET 时请求不相等。所以在我的情况下,存储请求是 POST,传入的是 GET,所以它返回是相等的,所以它工作错误。我能用它做什么?在这种特定的比较中是错误还是有某种意义?

更新。 我重新运行错误,发现我的主要描述不完整。我试着更详细地描述它。我有 GET url,它打开表单并通过 AJAX 提交与带有弹出消息窗口的 POST 相同的 URL。我执行 GET URL,表单打开。比我注销,并尝试提交表单。弹出窗口输出错误。我登录并重定向到 URL(与 GET/POST 请求相同),但在屏幕上看到的不是表单,而是我的 AJAX 请求的 JSON 响应,在 Firebug 中我看到登录后执行 POST 请求。当我在登录后删除缓存过滤器时,我重定向到相同的 URL,但它不是作为 POST 请求,而是像往常一样 GET 请求并打开表单。

【问题讨论】:

    标签: spring spring-security


    【解决方案1】:

    正如the manual 所说,保存请求处理是一种“尽力而为”的方法。不可能是所有人的全部。它会在执行登录时缓存一个请求(无论是什么请求方法,GET,POST 等),然后在登录后重定向到缓存的 URL。

    重定向后的传入请求将是 GET(例如,您不能重定向到 POST),因此它会尽力将其与缓存的请求相匹配,并决定是否应该使用缓存的请求替换它,从而继续进行,就好像登录从未发生过一样。

    您发布的代码是指用户尝试发出 GET 请求然后被提示登录的情况。如果后续对同一 URL 的请求不是 GET,则 不是 登录后重定向的结果,所以应该不 使用缓存的请求来替换它.

    您可以使用request-cache 命名空间元素自定义RequestCache,或将其替换为无操作实现。如果不想使用缓存请求,可以设置form-login 配置的always-use-default-target 属性。

    【讨论】:

    • 首先感谢您的帮助!可能是我错过了什么,但就我而言,它是如何工作的?我发出 POST 请求,重定向到登录表单,登录,然后 Spring 恢复最后一个 GET 请求(所有其他请求都被忽略)?所以在我的情况下,存储在缓存中的最后一个 GET 请求可能与我在登录之前执行的 POST 请求的 URL 相同?开始的原因(我希望你在开始的帖子中关注我)我认为 spring 从缓存中恢复 POST 请求并将其作为 GET 请求执行。
    • 如果一个请求从缓存中恢复,它的方法和原来一样。它不会被转换。如果您在系统提示您登录时同时向同一个 URL 提交大量请求,那么事情可能会变得混乱。你需要在你的应用程序中控制它。这不是 Spring Security 可以为您做的事情。再次,查看调试日志。它详细记录了每个请求的处理方式。
    • 我更改了代码以使所有 GET 和 POST 请求映射到不同的路径,所以它解决了问题,因为在 RequestCache 配置中我没有找到任何对我的情况有帮助的东西(据我了解 RequestCache config 主要允许控制映射路径,或者我丢失了一些对我有用的东西?)。
    • RequestCache 是一个接口,因此您可以按照自己的意愿实现它。但是,您的问题中没有任何内容表明默认行为不应该满足您的要求。因此,您可能应该进行一些调试以首先确定实际缓存的内容以及如何恢复它。还要确保您使用的是最新版本的 Spring Security。
    • 请看一下开始帖子,我更详细地描述了错误。如果这种缓存操作不正确,我可以提供更多信息来帮助修复可能的错误。感谢您的帮助!
    猜你喜欢
    • 2018-02-19
    • 2019-01-10
    • 2011-11-26
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多