[英]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.