Как мне реализовать Interceptor/Filter в игровой среде 2.4.3 (Scala)

Я новичок в Play Framework и хотел реализовать перехватчик или фильтр, который выполняется до того, как запрос будет передан классу Action.

Я хотел, чтобы перехватчик/фильтр возвращал ошибку HTTP (например, 401), если определенная переменная заголовка отсутствует.

Я немного погуглил и узнал об объекте Filter (play.api.mvc.Filter), но реализация возвращает mvc.Result вместо Response.

переопределить определение применения (далее: (mvc.RequestHeader) => Future [mvc.Result]) (запрос: mvc.RequestHeader)

Еще одно решение, которое я могу придумать, - это создать настраиваемое действие, расширив ActionBuilder, но я бы не стал этого делать, если бы я мог разработать универсальную функциональность, такую ​​​​как фильтр.

Любая помощь будет оценена. Спасибо.


person Allan    schedule 17.11.2015    source источник


Ответы (2)


Для дальнейшего использования. Это реализация фильтра. Спасибо tryx за помощь.

import play.api.mvc
import play.api.mvc.{RequestHeader, Filter}
import play.api.mvc.Results._
import scala.concurrent.ExecutionContext.Implicits.global

class AuthorizedFilter(requestHeader: RequestHeader) extends Filter {



  private def authorizationRequired(request: mvc.RequestHeader) = {

    request.headers.get("Authorized").
      map( authorizedValue => authorizedValue.eq("ABCDEFG")).
      getOrElse(false)

  }


  override def apply(next: (mvc.RequestHeader) => Future[mvc.Result])(request: mvc.RequestHeader) =  {
      if(authorizationRequired(request)) {

        println("YOU are authorized!!")

        next(request)

      }
      println("NOT AUTHORIZED!")
      Future {Unauthorized }
    }
}

Создайте объект Filter на корневом уровне приложения. (/приложение).

import javax.inject.Inject

import play.api.http.HttpFilters

class Filters @Inject() (authorizedFilter: AuthorizedFilter) extends HttpFilters {

  def filters = Seq(authorizedFilter)
}
person Allan    schedule 18.11.2015

В вашем фильтре у вас есть 2 варианта: вы можете либо вызвать next, который передает управление следующему фильтру, либо вы можете явно вернуть Future[Result], который завершает цепочку. Если вы вызовете next, в конце концов цепочка фильтров закончится, и она дойдет до действия.

Похоже, вам нужен фильтр с методом apply, например

apply(next: RequestHeader => Future[Result])(request: RequestHeader): Future[SimpleResult] = {
  if (headersok){
    next(request)
  } else {
    Future{ Unauthorized }
  }

}

person tryx    schedule 18.11.2015