簡體   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