我目前有一个指令,用于保护Akka HTTP应用中的资源,如下所示:
def authenticate: Directive1[Login] =
optionalHeaderValueByName("Authorization") flatMap {
val accessToken = authz.split(' ').last
case Some(authz) =>
LoggedInUser findByAccessToken accessToken match {
case Some(user) => provide(user)
case None => reject(AuthorizationFailedRejection)
}
case None => reject(AuthorizationFailedRejection)
}
其中LoggedInUser.findByAccessToken()
对数据库进行阻塞查询,我想将这个异步ask
切换到一个可以提供相同数据的actor,我可以通过在ActorRef
中作为指令的参数,但我无法弄清楚如何处理问题返回的Future
。
Akka HTTP附带的Directive1
示例似乎都没有这样做(至少我可以找到),尽管有一些返回Route
的指令的例子。
我想做甚么可能吗?是一种可能的方法来创建一个StandardRoute
子类,其中包含用户凭据的字段并以某种方式返回吗?
答案 0 :(得分:19)
是的,有可能。据我所知,你需要这样的东西:
def authenticate: Directive1[Login] = {
def findByAccessToken(accessToken:String): Future[Option[Login]] = ???
optionalHeaderValueByName("Authorization").flatMap {
case Some(authz) =>
val accessToken = authz.split(' ').last
onSuccess(findByAccessToken(accessToken)).flatMap {
case Some(user) => provide(user)
case None => reject(AuthorizationFailedRejection)
}
case None => reject(AuthorizationFailedRejection)
}
}