我想實現類似於此示例的認證機制:播放2.2 EssentialAction隨着期貨
def HasToken(action: String => EssentialAction): EssentialAction = EssentialAction { requestHeader =>
val maybeToken = requestHeader.headers.get("X-SECRET-TOKEN")
maybeToken map { token =>
action(token)(requestHeader) // apply requestHeader to EssentialAction produces the Iteratee[Array[Byte], SimpleResult]
} getOrElse {
Done(Unauthorized("401 No Security Token\n")) // 'Done' means the Iteratee has completed its computations
}
}
然而,在我的情況,我映射一個隨機令牌值存儲在服務器端的會話在Mongodb。目標是能夠讓用戶隨意終止所有其他會話。
不過,我從ReactiveMongo獲得的數據將被包裹在一個未來。
我想是這樣的:
def HasToken(action: String => EssentialAction): EssentialAction = EssentialAction { requestHeader =>
val maybeToken = requestHeader.headers.get("session")
maybeToken map { token =>
//This returns a future..
Session.find(session).map { result =>
result match
case Some(session) => action(session)(requestHeader)
case None => Done(Unauthorized())
}
} getOrElse {
Done(Unauthorized("401 No Security Token\n")) // 'Done' means the Iteratee has completed its computations
}
}
這可能與EssentialAction?
我得到一個'found:scala.concurrent.Future [play.api.libs.streams.Accumulator [akka.util.ByteString,play.api.mvc.Result]]','required:scala.concurrent.Future [play .api.libs.iteratee.Iteratee [?,?]]'......可能我錯過了一些東西(沒有這個很正確)! –