2015-10-09 15 views
11

Tôi hiện đang có một chỉ thị mà tôi đang sử dụng để bảo đảm các nguồn lực trong một ứng dụng Akka HTTP, như vậy:Tôi làm cách nào để sử dụng Tương lai bên trong Chỉ thị 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) 
    } 

nơi LoggedInUser.findByAccessToken() làm cho một truy vấn chặn chống lại một cơ sở dữ liệu, tôi muốn chuyển đổi này cho một không đồng bộ ask cho một diễn viên có thể cung cấp cùng một dữ liệu, tôi OK khi chuyển số ActorRef làm tham số cho chỉ thị nhưng tôi không thể tìm ra cách xử lý số Future mà yêu cầu trả về.

Không ai trong số Directive1 ví dụ đi kèm với Akka HTTP dường như làm điều này (ít nhất tôi không thể tìm thấy bất kỳ) mặc dù có các ví dụ về chỉ thị trả về Route.

Tôi có muốn làm điều gì không? Là một cách tiếp cận có thể tạo ra một lớp con StandardRoute với một trường cho thông tin xác thực người dùng và trả về bằng cách nào đó?

Trả lời

15

Có, điều đó là có thể. Theo như tôi hiểu, bạn cần một cái gì đó như thế này:

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

Vâng, đã làm việc, cảm ơn! –

Các vấn đề liên quan