【问题标题】:How do I ensure my Java Play application only accepts HTTP requests from a particular host?如何确保我的 Java Play 应用程序只接受来自特定主机的 HTTP 请求?
【发布时间】:2017-08-05 01:22:42
【问题描述】:

我将Play framework for Java 用于应用程序。我试图通过在多个服务器上部署应用程序的副本并在数据库中有一个可配置的节点列表来使其分布,这些节点必须能够相互通信。在 MongoDB 中,列表以 JSON 格式存储,如下所示:

{
  "master": "host1.com:2678",
  "nodes": ["host2.com:2678", "host3.com:2678", "host4.com:2678"]
}

部署在每台服务器上的代码是相同的,但调度程序仅在主节点上启用,并将根据节点的繁忙程度将特定工作调度到节点。此处未提供代码,因为调度程序操作的细节对我的问题并不重要。

为了知道他们有多忙,安排事情和其他状态更新,节点需要能够相互通信。 Play Framework 的 Web Service client 允许我通过从一个节点向另一个节点发出 HTTP 请求来做到这一点

HttpResponse res = WS.url("http://host2.com").get();

但这个想法是,特定的 HTTP 请求(例如用于调度的请求)仅在来自另一个节点(无论是主节点还是从节点)而不是来自 Web 浏览器、curl 等的情况下才被允许. 我如何安全地做到这一点?我可以检查传入请求的主机或特定标头,但这些肯定很容易伪造吗?

【问题讨论】:

    标签: java security playframework playframework-2.0


    【解决方案1】:

    如果您希望在所有控制器上强制执行此操作,请查看允许播放的主机 filter

    如果您想在特定的 Controller \ 方法上强制执行此过滤器,您可以尝试这样做:

    class MyController @Injects()(filter: AllowedHostsFilter) extends Controller {
      def get = filter.apply(Action.async { implicit request =>
        Future.successful(Ok)
      })
    }
    

    【讨论】:

    • 他们对所有 HTTP 请求应用了一个空白过滤器。有没有办法只将其应用于特定的控制器?
    • @SamuilDichev 我更新了我的答案。希望对你有帮助。
    • 这绝对是我要找的东西。但是,您是否有机会向我展示这是如何在 Java 中完成的?我不确定我是否完全理解您使用该代码所做的事情。
    【解决方案2】:

    您可以查看pac4j.org,他们有很多选项可以在游戏中实施安全功能。

    你也许可以通过IP地址过滤:

    http://www.pac4j.org/1.9.x/docs/authenticators/ip.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      相关资源
      最近更新 更多