簡體   English   中英

播放2.2.x,帶有身份驗證和請求擴展的操作組合

[英]Play 2.2.x, Action Composition with Authentication and Request extension

我正在嘗試創建一個ActionBuilder來檢查用戶是否已登錄,如果已登錄,則將用戶對象添加到request(AuthenticatedRequest)中。 使用MySQL,這將很容易,因為解析用戶將不會獲得Future對象。 但是在這種情況下,我們將MongoDB與Play的ReactiveMongo結合使用,這確實會返回將來的值。

到目前為止,我已經在此處做了這個小片段。 但這讓我感到類型不匹配:

類型不匹配; 找到:scala.concurrent.Future [Option [models.User]] => scala.concurrent.Future [Object]必需:Object =>嗎?

object Authenticated extends ActionBuilder[AuthenticatedRequest] {


def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[SimpleResult]) = {
    import models.User
    (for{
      sID <- request.session.get("sessionID")
      code <- request.session.get("otherCode")
      user: Future[Option[User]] <- models.Session.getUserBySessionAndCode(sID, code)
    } yield {
      (for{
        uAbs <- user
      } yield {
        if(uAbs.isDefined) {
          block(AuthenticatedRequest(uAbs.get, request))
        }else{
          BadRequest
        }
      })
    }).getOrElse(Future.successful(BadRequest))
  }
}

您知道如何從這里繼續嗎? 也許這甚至是錯誤的方法。 謝謝!

如何將步驟分成較小的塊,並按照您期望的類型顯式鍵入它們,這樣可以使您更清楚地了解想法和所寫內容的方向,例如:

def userFromRequest(request: Request): Future[Option[User]] = 
  for{
    sID <- request.session.get("sessionID")
    code <- request.session.get("otherCode")
    maybeUser <- models.Session.getUserBySessionAndCode(sID, code)
  } yield maybeUser

def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[SimpleResult]) = {
  userFromRequest(request).flatMap {
    case None => Future.successful(BadRequest)
    case Some(user) => block(AuthenticatedRequest(user, request))
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM