繁体   English   中英

在 Spring Boot AWS 容器中重写 url

[英]Rewrite url in Spring Boot AWS container

我有一个 Spring Boot 应用程序,它可能是作为医疗设备的软件,并且有一个受 oauth2 保护的部分和一个演示部分。 我想将它们放在单独的主机名中,例如protected.example.com 和demo.example.com。 我可以用一个简单的 Apache2 proxypass 指令完美地做到这一点:

ServerName demo.example.com
ProxyPassReverse / http://localhost:9000/demo/
ProxyPass / http://localhost:9000/demo/

问题是我需要在 Amazon Web Services 上部署它,它不会让我重定向到路径,只能重定向到服务器。 我已经实现了 tukey-urlrewrite-filter,但它在 SecurityContextPersistenceFilter 之后被调用,并将它放在该过滤器失败之前:

17:40:00 ERROR o.a.c.c.C.[Tomcat].[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception java.lang.NullPointerException: null
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:373)

我不确定是否要为https://demo.example.com中的任何 url 绕过 Spring Security。 我知道我可以将演示分解成一个单独的容器/上下文/任何东西,但这似乎在计算上是多余的,并且存在并行代码库的风险。 我的目标是让受邀查看 demo.example.com 的人不知道 protected.example.com 存在。 是否有一个“简单”的方法来解决这个问题:

  1. 一种允许 demo.example.com 允许 All() 的简单方法
  2. 一种将 /demo 放在单独端口上的方法
  3. 一种允许 urlrewrite-filter 进入过滤器链顶部的方法。
  4. AWS 中未记录的功能

释放你的创造力!

这是我学到的。 问题是将 Tuckey(或任何过滤器)放在 SecurityContextPersistenceFilter 之前。 直到 HeaderWriterFilter 之后,请求才填充 PathInfo。 它确实有 URI。 在链中稍后移动过滤器可以解决这个问题,但它应该在身份验证过滤器之前。

我在原始帖子中没有提到的是 /demo 和保护区共享静态资源,因此必须避免在 demo.example.com 的 URI 上添加 /demo。 解决方案是:

public class rewriteDemoFilter extends GenericFilterBean {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String hostname = request.getServerName();
        String path = request.getRequestURI();
        String base;
        if (path.length() == 1) {
            base = "";
        } else {
            String[] components = path.split("/");
            base = components[1];
        }
        if (hostname.equalsIgnoreCase("demo.example.com")) {
            switch (base) {
                case "js":
                case "sounds":
                case "webjars":
                case "css":
                case "images":
                    break;
                default:
                    path = "/demo" + path;
            }
            request.getRequestDispatcher(path).forward(servletRequest, servletResponse);
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
     }
}

此过滤器应添加到安全配置中:

.addFilterAfter(new rewriteDemoFilter(), HeaderWriterFilter.class)

此解决方案的优点是 URL 修改全部在 Spring 应用程序中完成,因此我的开发环境(Apache 转发到从命令行启动的 Spring 应用程序)和我的 AWS 环境(在 ECS 任务中运行的 Docker 映像)不要' t 需要不同的机制来重写路径。 不利的一面是我的安全被绕过了,但是由于过滤器只处理发往站点未受保护领域的请求,并且严格的防火墙从 URI 中删除了危险模式,所以我对只有小型卡车可以通过这个洞持适度乐观的态度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM