控制器的身份验证.Assets.versioned

时间:2016-12-22 12:11:47

标签: scala playframework

在访问静态资源之前,我想在Play Framework中验证用户身份(如果没有会话,用户无法访问html文件)。

GET      /assets/*file  @controllers.Assets.versioned(path="/public", file: Asset)

在java控制器中,@ Security.Authenticated(... class)注释用于使方法可访问。

如何限制对静态资源的访问?

谢谢

1 个答案:

答案 0 :(得分:1)

撰写Filter,查看用户是否使用uri访问资产。尝试在过滤器中验证用户。如果auth成功,则允许用户,如果不仅仅是阻止用户访问资产资源。

我们如何知道用户正在访问资产?

rh.uri.startsWith("/assets")

通过检查uri,他可以检查用户是否正在访问资产。

如果用户没有尝试访问资产,只允许他通过

传递
 f(rh)

在项目的根文件夹中创建Filters单例(这样您就不需要将其添加到application.conf

编写过滤器并将过滤器注入Filters扩展DefaultHttpFilters

这是完整的工作代码。

import akka.stream.Materializer
import com.google.inject.{Inject, Singleton}
import play.api.Logger
import play.api.http.DefaultHttpFilters
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import play.api.mvc.{Filter, RequestHeader, Result, Results}

import scala.concurrent.Future

@Singleton
class Filters @Inject() (assetsFilter: AssetsFilter) extends DefaultHttpFilters(assetsFilter) {}

object UserAuthHelper {
  def checkUser(rh: RequestHeader): Future[Boolean] = Future.successful(true)
}

@Singleton
class AssetsFilter @Inject() (implicit val mat: Materializer) extends Filter {
  override def apply(f: (RequestHeader) => Future[Result])(rh: RequestHeader): Future[Result] = {
    Logger.info(s"uri ${rh.uri}")
    if (rh.uri.startsWith("/assets")) {
      UserAuthHelper.checkUser(rh).flatMap { result =>
        if (result) {
          Logger.info("User authenticated allow him to use assets")
          f(rh)
        } else {
          Logger.info("stop user. user is trying to access assets without auth.")
          Future.successful(Results.Forbidden("I do not know you."))
        }
      }
    } else f(rh)
  }
}