Spring`SavedRequest`是否包含任何清除逻辑以避免重定向循环或类似情况?

时间:2019-07-18 17:07:21

标签: java spring spring-security

我正在使用SavedRequest将用户登录后重定向到最初请求的URL。

我得到这样的网址:

public String requestedUrl(HttpServletRequest request, HttpServletResponse response) {
        SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response);
        if (savedRequest != null) {
            return savedRequest.getRedirectUrl();
        }
        return "";
}

我想知道是否值得检查该URL,例如

  • 基本路径与配置的应用程序基本路径相对应(出于安全原因)
  • 路径未重定向到/ login或其他可能导致无限重定向循环的url

SavedRequest是否执行与此类似的清理?如果是,究竟是哪个?

1 个答案:

答案 0 :(得分:0)

这不是一个答案,它基于对代码的调查,因为我很好奇。 :3

让我开始说,了解您如何在项目中配置Spring Security以真正解决问题的根源将非常有用。当您从SavedRequest进行跟踪以了解它在Spring Security中的使用方式时,有很多可能的途径可以解决一切在开始时如何连接和配置的问题。

如前所述,直接与SavedRequest相邻的代码非常简单,以至于通常与问题的根源无关。您的问题的重点可以扩大:“ Spring Security是否可以在应用SavedRequests时避免重定向循环到/ login?”

我认为文档10.1.4 Request Matching and HttpFirewall确实解决了您有关基本路径的问题:

  

Servlet规范为HttpServletRequest定义了一些属性,可以通过getter方法访问这些属性,我们可能希望将这些属性匹配。这些是contextPath,servletPath,pathInfo和queryString。 Spring Security只对保护应用程序中的路径感兴趣,因此将忽略contextPath。

强调我的。

在默认配置中,看来DefaultSavedRequest将是根据SavedRequest使用的HttpSessionRequestCache的实现。

自从您最初提出问题以来,

DefaultSavedRequest并没有进行广泛的changes

可以肯定地说,该类的实现非常简单,非常类似于bean,并且将其自身限制为保存提出的请求。除了排除某些标头(“跳过If-Modified-Since和If-None-Match标头”之外),它在构造期间不执行任何分析。

public DefaultSavedRequest(HttpServletRequest request, PortResolver portResolver) {
    Assert.notNull(request, "Request required");
    Assert.notNull(portResolver, "PortResolver required");

    // Cookies
    addCookies(request.getCookies());

    // Headers
    Enumeration<String> names = request.getHeaderNames();

    while (names.hasMoreElements()) {
        String name = names.nextElement();
        // Skip If-Modified-Since and If-None-Match header. SEC-1412, SEC-1624.
        if (HEADER_IF_MODIFIED_SINCE.equalsIgnoreCase(name)
                || HEADER_IF_NONE_MATCH.equalsIgnoreCase(name)) {
            continue;
        }
        Enumeration<String> values = request.getHeaders(name);

        while (values.hasMoreElements()) {
            this.addHeader(name, values.nextElement());
        }
    }

    // Locales
    addLocales(request.getLocales());

    // Parameters
    addParameters(request.getParameterMap());

    // Primitives
    this.method = request.getMethod();
    this.pathInfo = request.getPathInfo();
    this.queryString = request.getQueryString();
    this.requestURI = request.getRequestURI();
    this.serverPort = portResolver.getServerPort(request);
    this.requestURL = request.getRequestURL().toString();
    this.scheme = request.getScheme();
    this.serverName = request.getServerName();
    this.contextPath = request.getContextPath();
    this.servletPath = request.getServletPath();
}

addCookiesaddHeaderaddLocalesaddParameters同样简单。此类无法解析请求以防止无限重定向,甚至无法检查其基本路径。

因此,我们将进一步投放网络以寻找另一个嫌疑犯。接下来是HttpSessionRequestCache。可以根据您对Spring Security的使用情况以各种方式创建Bean,因此事情HttpConfigurationBuilder / HttpSecurity / RequestCacheConfigurer会逐渐发展。专家+您的更多信息确实将受到欢迎!