在Deadbolt的getSubject中处理Future [User]

时间:2014-09-01 14:29:27

标签: playframework playframework-2.0 deadbolt

Deadbolt中有没有办法在MyDeadboltHandler的getSubject方法中使用Future [User]而不会阻塞?

当前方法需要一个请求并返回一个Option [Subject]

override def getSubject[A](request: Request[A]): Option[Subject] = {
  currentUser //<-- currentUser is a Future[User] 
  ....
}

3 个答案:

答案 0 :(得分:1)

在没有先等待Future[A]完成的情况下,您无法将Option[B]映射到Future。无论呼叫是什么getSubject都知道它是同步呼叫,因此无论你是否使用Option[Subject],它都会等待Future

override def getSubject[A](request: Request[A]): Option[Subject] = {
    val user = Await.result(currentUser, Duration.Inf) // Or whatever Duration you deem appropriate
    ....
}

答案 1 :(得分:1)

您可以这样做的唯一方法是下载源代码,然后修改它以返回未来。我这样做了,但后来决定最好不要这样做,因为我会在每个请求上点击数据库,即使没有必要。我的解决方案是在会话中存储足够的数据来授权用户。

原因这取决于您的应用程序需要多少安全性?在我的情况下,在业务逻辑中处理它就足够了。

答案 2 :(得分:1)

我将为Deadbolt的下一个版本进行此更改。

更新:Deadbolt版本2.3.2现在给你...... Scala:未来[选项[主题]] Java:F.Promise

此外,此版本可通过Maven Central获得,因此您无需再指定Objectify Repository解析器。旧版本仍然需要解析器。