如何在使用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的Play Framework中限制IP列表访问?
我正在使用Play Framework 2.2.4
我找到了Java的解决方案:http://feadro.com/simple-ip-access-list-for-play-2-1-with-java/
那么在Scala中应该怎么做呢?
application.conf
文件中。myapp.ipwhitelist = ["192.168.1.1", ...]
接下来创建一个全局过滤器,用于应用于每个传入请求,例如:
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
我认为生产环境需要更多的HTTP配置(公共,接受任何HTTP请求),应该使用HTTP前端服务来适当地将请求分配到Play。
至于我是否可以将一个子域名映射到多个Play框架入口点,使用像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.";
}
lazy val
可能是个好主意,除非你真的需要在每个请求上重新从文件中读取白名单。 - millhouseplay.filters.hosts
,这个方法就行不通了,对吧? - Todor KolevAccumulator.done(Results.Forbidden)
而不是Iteratee。 - Ikrom