在Play Framework(Scala)中限制对特定IP的访问

时间:2014-08-10 12:19:38

标签: scala playframework-2.0 playframework-2.2

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

我正在使用Play Framework 2.2.4

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

我应该如何在Scala中执行此操作?

2 个答案:

答案 0 :(得分:5)

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}"))
    }
  }
}

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

object Global extends WithFilters(IPFilter) with GlobalSettings

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

答案 1 :(得分:0)

我认为对于生产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.";
}