首页 > 解决方案 > 整个控制器的身份验证

问题描述

我有一个需要身份验证的控制器和不需要身份验证的控制器的项目。

我已经在此处实现了有关操作组合的文档,因此我将我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 {

如何重构父控制器中的注入,并将用户操作应用于控制器中的所有操作?

标签: scalaplayframeworkplayframework-2.6

解决方案


您必须将自定义操作应用于每个控制器端点。在您的情况下,将自定义操作应用于控制器中需要身份验证的每个功能。

在文档中再往下一点,您会发现如何:

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)
}

现在request是 aUserRequest并且已经检查了权限。

编辑

由于您没有ItemAction,只需将该行重写为:

(userAction andThen PermissionCheckAction)

推荐阅读