【问题标题】:Restrict access to specific IP in Play Framework (Scala)限制对 Play Framework (Scala) 中特定 IP 的访问
【发布时间】:2014-10-03 09:52:52
【问题描述】:

如何使用 Scala 限制对 Play Framework 中 IP 列表的访问?

我正在使用 Play Framework 2.2.4

我找到了 Java 的解决方案: http://feadro.com/simple-ip-access-list-for-play-2-1-with-java/

我应该如何在 Scala 中做到这一点?

【问题讨论】:

    标签: scala playframework-2.0 playframework-2.2


    【解决方案1】:

    application.conf中粘贴你要限制的IP。

    myapp.ipwhitelist = ["192.168.1.1", ...]
    

    然后创建一个global filter 应用于每个传入的请求,例如:

    import scala.collection.JavaConverters._
    import play.api.libs.concurrent.Execution.Implicits._
    import play.api.libs.iteratee.Iteratee
    import play.api.Play.current
    import play.api.mvc._
    
    object IPFilter extends EssentialFilter {
      def apply(nextFilter: EssentialAction) = new EssentialAction {
        def apply(requestHeader: RequestHeader) = {
          // read the IPs as a Scala Seq (converting from the Java list)
          val ips: Seq[String] = current.configuration.getStringList("myapp.ipwhitelist")
                .map(_.asScala).getOrElse(Seq.empty)
    
          // Check we've got an allowed IP, otherwise ignore the
          // request body and immediately return a forbidden.
          if (ips.contains(requestHeader.remoteAddress)) nextFilter(requestHeader)
          else Iteratee.ignore[Array[Byte]]
            .map(_ => Results.Forbidden(s"Bad IP! ${requestHeader.remoteAddress}"))
        }
      }
    }
    

    然后在您的应用程序全局对象中启用它:

    object Global extends WithFilters(IPFilter) with GlobalSettings
    

    如果您想要更大的灵活性,您可以使用相同的逻辑,但使用 Action composition 而不是全局过滤器。

    【讨论】:

    • 在启动时将 IP 读入 lazy val 可能是个不错的主意,除非您真的需要在每次请求时从文件中重新读取白名单。
    • 如果您启用了play.filters.hosts,这将不起作用,是吗?
    • 在play 2.6中我使用Accumulator.done(Results.Forbidden)而不是Iteratee
    【解决方案2】:

    我认为,对于需要不仅仅是简单配置(公共,接受任何 HTTP 请求)的生产 HTTP 环境,应该使用 HTTP 前端服务来向 Play 发送适当的请求。

    至于Can I (DNS) map one subdomain to multiple Play Framework entry points,使用Apache、Nginx或Varnish等服务来配置HTTP ACL(访问控制列表)是有优势的。例如在 Varnish 中:

    acl my-acl {
        "an-authorized-host";
        "1.2.3.4";
    }
    
    # Then ...
    if (!client.ip ~ my-acl) {
        error 405 "Not allowed.";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      相关资源
      最近更新 更多