我想实现类似于此示例的认证机制:播放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 [?,?]]'......可能我错过了一些东西(没有这个很正确)! –