Я пытаюсь реализовать механизм аутентификации, аналогичный этому примеру:
def HasToken(action: String => EssentialAction): EssentialAction = EssentialAction { requestHeader =>
val maybeToken = requestHeader.headers.get("X-SECRET-TOKEN")
maybeToken map { token =>
action(token)(requestHeader) // apply requestHeader to EssentialAction produces the Iteratee[Array[Byte], SimpleResult]
} getOrElse {
Done(Unauthorized("401 No Security Token\n")) // 'Done' means the Iteratee has completed its computations
}
}
Однако в моем случае я сопоставляю случайное значение токена с сеансом на стороне сервера, хранящимся в MongoDB. Цель заключалась в том, чтобы пользователь мог по своему желанию завершать все остальные сеансы.
Однако данные, которые я получаю от ReactiveMongo, будут упакованы в Future.
Я хотел бы что-то вроде этого:
def HasToken(action: String => EssentialAction): EssentialAction = EssentialAction { requestHeader =>
val maybeToken = requestHeader.headers.get("session")
maybeToken map { token =>
//This returns a future..
Session.find(session).map { result =>
result match
case Some(session) => action(session)(requestHeader)
case None => Done(Unauthorized())
}
} getOrElse {
Done(Unauthorized("401 No Security Token\n")) // 'Done' means the Iteratee has completed its computations
}
}
Возможно ли это с EssentialAction?