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

Luk*_*lar 6 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 "";
}
Run Code Online (Sandbox Code Playgroud)

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

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

请问是否有SavedRequest与此类似的清理工作?如果是,那到底是什么?

Jon*_*son 1

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

首先我要说的是,了解如何在项目中配置 Spring Security 以真正找到问题的根源是很有用的。当您追溯SavedRequest它在 Spring Security 中的使用方式时,会发现很多可能的途径,涉及到一开始如何连接和配置所有内容。

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

我认为文档10.1.4 请求匹配和 HttpFirewall确实解决了您有关基本路径的问题:

Servlet 规范为 HttpServletRequest 定义了几个属性,这些属性可通过 getter 方法访问,并且我们可能希望对其进行匹配。它们是 contextPath、servletPath、pathInfo 和 queryString。Spring Security 只对保护应用程序内的路径感兴趣,因此 contextPath 被忽略。

强调我的。

在默认配置中,似乎将根据使用中DefaultSavedRequest的实现。SavedRequestHttpSessionRequestCache

DefaultSavedRequest自从您最初提出问题以来,没有发生任何广泛的变化。

建立这一点后,我们可以说该类的实现相当简单,非常类似于 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();
}
Run Code Online (Sandbox Code Playgroud)

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

因此,我们将进一步撒网寻找另一名嫌疑人。接下来是HttpSessionRequestCache. 根据您对 Spring Security 的使用情况,可以通过多种方式创建 bean,因此事情从那里开始螺旋式发展HttpConfigurationBuilder// HttpSecurityRequestCacheConfigurer确实欢迎专家+您提供更多信息!