我目前有一个指令,我用来保护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)
}
Run Code Online (Sandbox Code Playgroud)
在哪里LoggedInUser.findByAccessToken()
对数据库进行阻塞查询,我想把它转换为异步ask
到一个可以提供相同数据的actor,我可以将ActorRef
as作为参数传递给指令但我无法解决如何处理问题Future
返回.
Directive1
Akka HTTP附带的所有示例似乎都没有这样做(至少我可以找到),尽管有一些指令返回的例子Route
.
我甚至想做什么?是一种可能的方法来创建一个StandardRoute
具有用户凭据字段的子类并以某种方式返回?
Nya*_*vro 21
对的,这是可能的.据我所知,你需要这样的东西:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3121 次 |
最近记录: |