在访问静态资源之前,我想在Play Framework中验证用户身份(如果没有会话,用户无法访问html文件)。
GET /assets/*file @controllers.Assets.versioned(path="/public", file: Asset)
在java控制器中,@ Security.Authenticated(... class)注释用于使方法可访问。
如何限制对静态资源的访问?
谢谢
答案 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)
}
}