Аутентификация для всего контроллера - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть проект с контроллерами, которые нуждаются в аутентификации, и с контроллерами, которые не нуждаются.

Я реализовал документацию по составу действий здесь , поэтому я вставляю свой UserAction в каждый контроллер, которыйнеобходима аутентификация

class UserRequest[A](val user: Option[String], request: Request[A]) extends WrappedRequest[A](request)

class UserAction @Inject()(val parser: BodyParsers.Default)(implicit val executionContext: ExecutionContext)
  extends ActionBuilder[UserRequest, AnyContent] with ActionTransformer[Request, UserRequest] {

  def transform[A](request: Request[A]) = Future.successful {
    if(request.queryString.contains("token")){
      val token = request.queryString("token").head
      new UserRequest(Some(token), request)
    } else {
      new UserRequest(None, request)
    }
  }

  def PermissionCheckAction(implicit ec: ExecutionContext) = new ActionFilter[UserRequest] {
    def executionContext = ec
    def filter[A](input: UserRequest[A]) = Future.successful {
      if (input.user.isEmpty)
        Some(Results.Unauthorized)
      else
        None
    }
  }
}

И контроллер hte:

class ResultsController @Inject()(
                                  adRepo: AdRepository,
                                  userAction : UserAction
                                ) extends InjectedController {

Как выполнить рефакторинг инъекций в родительском контроллере и применить действие useraction ко всем действиям в контроллере?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Другим возможным (и удобным) способом является извлечение действия проверки разрешения для черты:

trait AuthFilter {
  implicit val ec: ExecutionContext
  val userAction: UserAction
  def UserActionWithPermissionCheck: ActionBuilder[UserRequest, AnyContent] = userAction andThen userAction.PermissionCheckAction
}

И затем используйте этот фильтр всякий раз, когда вам нужно:

class ResultsController @Inject()(val userAction : UserAction)(implicit val ec: ExecutionContext)
  extends InjectedController with AuthFilter {

  def tagItemProtected(itemId: String, tag: String) =
    UserActionWithPermissionCheck { request =>
      Ok("UserReq: " + request)
    }

  def tagItem(itemId: String, tag: String) =
    userAction { request =>
      Ok("UserReq: " + request)
    }
}
0 голосов
/ 10 декабря 2018

Вы должны применить свое настраиваемое действие к каждой конечной точке контроллера.В вашем случае примените настраиваемое действие к каждой функции в вашем контроллере, которая нуждается в аутентификации.

Чуть дальше в документах вы найдете, как:

def tagItem(itemId: String, tag: String)(implicit ec: ExecutionContext) =
 (userAction andThen ItemAction(itemId) andThen PermissionCheckAction) { request =>
   request.item.addTag(tag)
   Ok("User " + request.username + " tagged " + request.item.id)
}

Теперь requesta UserRequest и разрешения проверены.

Редактировать

Поскольку у вас нет ItemAction, просто перепишите строку на:

(userAction andThen PermissionCheckAction)
...