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ます。ディレクティブのパラメーターとして を渡しても問題ありませんが、その方法がわかりません。Futureask が返す を処理します。

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 に答える