[英]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.