2015-10-09 10 views
11

Obecnie mam dyrektywę, że używam w celu zabezpieczenia zasobów w aplikacji Akka HTTP, tak jak poniżej:Jak korzystać z przyszłości w ramach dyrektywy HTTP Akka?

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) 
    } 

gdzie LoggedInUser.findByAccessToken() sprawia zapytania blokady przed bazie danych, chciałbym, aby przełączyć to dla asynchronicznej ask do aktora, który może dostarczyć te same dane, jestem OK z przekazaniem ActorRef jako parametr do dyrektywy, ale nie mogę się dowiedzieć, jak obsługiwać Future, że zwraca pytanie.

Żadne z przykładów Directive1, które pochodzą z Akka HTTP, wydają się tego nie robić (przynajmniej mogłem; t znaleźć dowolne) chociaż istnieją przykłady dyrektyw zwracających Route, które robią.

Czy to, co chcę robić, nawet możliwe? Czy możliwe jest utworzenie podklasy StandardRoute z polem dla poświadczeń użytkownika i zwrócenie go w jakiś sposób?

Odpowiedz

15

Tak, jest to możliwe. O ile rozumiem, potrzebujesz czegoś takiego:

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) 
    } 
} 
+0

Tak, zadziałało, dziękuję! –

Powiązane problemy