0

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

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

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

3 回答 3

1

如果不先等待完成,就无法将 a 映射Future[A]到a 。无论调用什么都知道它是一个同步调用,因此将等待您是否在其中使用s 。Option[B]FuturegetSubjectOption[Subject]Future

override def getSubject[A](request: Request[A]): Option[Subject] = {
    val user = Await.result(currentUser, Duration.Inf) // Or whatever Duration you deem appropriate
    ....
}
于 2014-09-01T16:29:53.487 回答
1

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

当然,这取决于您的应用程序需要多少安全性?就我而言,在业务逻辑中处理它就足够了。

于 2014-09-01T20:30:26.180 回答
1

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

更新:Deadbolt 2.3.2 版现在为您提供... Scala:Future[Option[Subject]] Java:F.Promise

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

于 2014-09-10T07:01:39.700 回答