Playframework 在门闩'中处理未来[用户];这是我的主题

Playframework 在门闩'中处理未来[用户];这是我的主题,playframework,playframework-2.0,deadbolt,Playframework,Playframework 2.0,Deadbolt,Deadbolt中有没有一种方法可以在MyDeadboltHandler的getSubject方法中使用Future[User]而不阻塞 当前方法需要一个请求并返回一个选项[Subject] override def getSubject[A](request: Request[A]): Option[Subject] = { currentUser //<-- currentUser is a Future[User] .... } 覆盖def getSubject[A](请

Deadbolt中有没有一种方法可以在MyDeadboltHandler的getSubject方法中使用Future[User]而不阻塞

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

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

当前用户//如果不先等待
未来
完成,就无法将
未来[a]
映射到
选项[B]
。任何调用
getSubject的对象都知道这是一个同步调用,因此将等待
选项[Subject]
是否在其中使用
Future
s

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

如果不先等待
Future
完成,就无法将
Future[a]
映射到
选项[B]
。调用
getSubject
的任何对象都知道这是一个同步调用,因此无论是否在其中使用
Future
都将等待
选项[Subject]

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

如果不先等待
Future
完成,就无法将
Future[a]
映射到
选项[B]
。调用
getSubject
的任何对象都知道这是一个同步调用,因此无论是否在其中使用
Future
都将等待
选项[Subject]

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

如果不先等待
Future
完成,就无法将
Future[a]
映射到
选项[B]
。调用
getSubject
的任何对象都知道这是一个同步调用,因此无论是否在其中使用
Future
都将等待
选项[Subject]

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[选项[主题]] 爪哇:承诺


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

我将在下一版本的Deadbolt中进行此更改

更新:Deadbolt的2.3.2版现在为您提供。。。 Scala:Future[选项[主题]] 爪哇:承诺


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

我将在下一版本的Deadbolt中进行此更改

更新:Deadbolt的2.3.2版现在为您提供。。。 Scala:Future[选项[主题]] 爪哇:承诺


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

我将在下一版本的Deadbolt中进行此更改

更新:Deadbolt的2.3.2版现在为您提供。。。 Scala:Future[选项[主题]] 爪哇:承诺


另外,这个版本可以通过Maven Central获得,所以您不再需要指定ObjyLogic存储库解析器。旧版本仍然需要解析器。

您是否考虑过使用Clay Cache以避免在每个请求上碰到DB?有什么问题吗?这将是一个更快的解决方案。因为我们仍然要去HI。t请求线程上的数据库。如果用户很少,这不是问题,但是如果用户很多,这是问题,因为缓存过期时,我们会越来越多地访问数据库。我只需在会话中存储足够的数据来重新生成权限,然后始终在后端代码中进行双重检查。不过,我现在使用自己的解决方案你有没有考虑过使用缓存来避免在每个请求上碰到DB?这有什么问题吗?这将是一个更快的解决方案。因为我们仍然会在请求线程上访问数据库。如果用户很少,那就不是问题了,但是如果我们有很多问题,因为我们会像CAC一样越来越多地攻击数据库。他过期了。我在会话中简单地存储了足够的数据来重新生成权限,然后总是重复检查后端代码。但是我现在使用的是我自己的解决方案,而不是死机