15

我目前有一个指令用于保护 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)
  }

whereLoggedInUser.findByAccessToken()对数据库进行阻塞查询,我想将此异步切换为ask可以提供相同数据的参与者,我可以将ActorRef作为参数传递给指令,但我不知道如何处理Future询问返回的问题。

Akka HTTP 附带的Directive1示例似乎都没有这样做(至少我找不到),尽管有返回的指令示例Route

我想做的甚至可能吗?是否有一种可能的方法来创建具有StandardRoute用户凭据字段的子类并以某种方式返回?

4

1 回答 1

22

对的,这是可能的。据我了解,您需要这样的东西:

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)
  }
}
于 2015-10-10T10:21:16.530 回答