我有一个返回a的方法Future
像这样...
def isTokenExpired(token: String): Future[Boolean] = {
...
}
...然后我有另一个调用的方法isTokenExpired
返回一个Boolean
像这样:
def isExpired(token: String): Boolean = {
var result = true
isTokenExpired(token).onComplete {
case Success(r) => result = r
case Failure(_) => result = true
}
result
}
有没有更好的方法来写isExpired
method?
EDIT
应EECOLOR的要求,让我向您提供更多详细信息。对于我的 Play 应用程序,我实现了基于 JSON Web Token (jwt) 的授权机制。除过期时间外,所有声明都包含在 jwt 中,过期时间存储在 MongoDB 集合中。下面是我的总结Token
类看起来像:
class Token {
...
def id: String = { ... }
def issueTime: LocalDateTime = { ... }
def issuer: String = { ... }
...
def isValid: Boolean = { ... }
def isExpired: Boolean = { /* uses ReactiveMongo to access MongoDB */ }
}
如您所见,除了过期信息之外,所有 jwt 属性都是独立的。方法isExpired
使用 ReactiveMongo,它总是返回一个Future
。为了使事情变得更加复杂,我在自定义中使用这个 jwtAction
像这样:
class SecuredAction[T <: Controller] private(private val methodName: String)
extends ActionBuilder[ApiRequest] {
...
def invokeBlock[A](request: Request[A], block: (ApiRequest[A]) => Future[SimpleResult]) = {{
request.headers.get(HeaderNames.AUTHORIZATION) match {
case Some(header) => s"""$AuthType (.*)""".r.unapplySeq(header).map(_.head.trim)
case _ => None
}} match {
case Some(tokenString) => {
val token = Token(tokenString)
if (!token.isValid) {
Logger.warn(s"request ${request.uri} not authorized: token ${token.id} has been tampered")
Future.successful(Unauthorized(AuthErrors.authenticationViolated(token.subject)(request).asJson))
} else if (token.isExpired) {
Logger.debug(s"request ${request.uri} not authorized: token ${token.id} has expired")
Future.successful(Unauthorized(AuthErrors.authenticationExpired(token.subject)(request).asJson))
} else if (!isAuthorized(token)) {
Logger.info(s"request ${request.uri} not authorized: required claims not defined for account ${token.subject}")
Future.successful(Forbidden(AuthErrors.requestNotAuthorized(token.subject)(request).asJson))
} else {
Logger.debug(s"request ${request.uri} authorized for account ${token.subject}")
block(new ApiRequest(token, request))
}
}
case _ => {
Logger.debug(s"request ${request.uri} not authenticated")
Future.successful(Unauthorized(
AuthErrors.requestNotAuthenticated()(request).asJson
).withHeaders(HeaderNames.WWW_AUTHENTICATE -> AuthType))
}
}
}
正如你所看到的,我需要返回一个Future[play.mvc.results.Result]
, not a Future[Boolean]
会返回isExpired
如果我用过Future.map
。你能说到点子上吗?