[英]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 存在。 是否有一個“簡單”的方法來解決這個問題:
釋放你的創造力!
這是我學到的。 問題是將 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.