Deadbolt 中有没有办法在 MyDeadboltHandler 的 getSubject 方法中使用 Future[User] 而不会阻塞?
当前方法需要一个请求并返回一个 Option[Subject]
override def getSubject[A](request: Request[A]): Option[Subject] = {
currentUser //<-- currentUser is a Future[User]
....
}
Deadbolt 中有没有办法在 MyDeadboltHandler 的 getSubject 方法中使用 Future[User] 而不会阻塞?
当前方法需要一个请求并返回一个 Option[Subject]
override def getSubject[A](request: Request[A]): Option[Subject] = {
currentUser //<-- currentUser is a Future[User]
....
}
如果不先等待完成,就无法将 a 映射Future[A]
到a 。无论调用什么都知道它是一个同步调用,因此将等待您是否在其中使用s 。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
....
}
您可以做到这一点的唯一方法是下载源代码,然后对其进行修改以返回未来。我这样做了,但后来决定最好不要这样做,因为我会在每个请求上访问数据库,即使没有必要。我的解决方案是在会话中存储足够的数据来授权用户。
当然,这取决于您的应用程序需要多少安全性?就我而言,在业务逻辑中处理它就足够了。
我将为 Deadbolt 的下一个版本进行此更改。
更新:Deadbolt 2.3.2 版现在为您提供... Scala:Future[Option[Subject]] Java:F.Promise
此外,此版本可通过 Maven Central 获得,因此您无需再指定 Objectify Repository 解析器。旧版本仍然需要解析器。