【问题标题】:How to pass user to each request?如何将用户传递给每个请求?
【发布时间】:2014-06-19 19:30:51
【问题描述】:

我有一个使用 securesocial 模块的 play 2 应用程序。在请求中有Identity 可用,但我需要我的用户对象(它扩展身份)传递给我的模板(因为用户包含一些额外的字段)所以对于每个控制器我有如下代码:

def index = SecuredAction { implicit request =>
    implicit val currentUser = UsersDAO.Users.findByIdentityId(request.user.identityId).get
    Ok(views.html.platform.support.index())
  }

基本上,对于用户登录的每个控制器的方法,我都在向数据库发出请求,以获取当前登录的用户,我觉得这很丑陋。有什么方法可以让每个用户会话加载一次?

更新:

我添加了一个局部函数来让事情变得更简单

def loadCurrentUser(f: (User) => Result)(implicit request: SecuredRequest[play.api.mvc.AnyContent]): Result =
        (for {
            loggedInUser <- UsersDAO.Users.findByIdentityId(request.user.identityId)
        } yield f(loggedInUser)).getOrElse(
            Redirect(securesocial.controllers.routes.LoginPage.login))

现在来自控制器的每个方法都将是这样的:

def index = SecuredAction { implicit request =>
    loadCurrentUser { implicit user =>
        Ok(views.html.platform.support.index())
    }
}

但我仍然希望用户在请求中或在他登录后以某种方式传递它的请求,而不是每次都从数据库加载它。

【问题讨论】:

    标签: playframework-2.0 securesocial


    【解决方案1】:

    我认为将整个用户存储在会话中是不明智的,因为我认为这被认为是不好的做法,并且当用户对象发生更改时(尤其是另一个用户,也许是管理员)。

    如果您想避免对每个请求进行数据库调用,我会使用缓存 API,但是当用户更改时,仍然需要注意更新/使缓存无效。不过,至少在缓存中它会全部放在一个地方。

    虽然您的loadCurrentUser 函数将绝对确定用户存在于数据库中,但节省了.get 的使用,但我认为这有点多。如果首先调用了loadCurrentUser,则该用户应该存在,如果他们不存在,则他们的会话应该已失效,因此会在 SecureSocial 级别阻止请求。

    考虑定义:

    implicit def currentUser(implicit request: SecuredRequest[AnyContent]): User = UsersDAO.Users.findByIdentityId(request.user.identityId).get
    

    这将缩短您在SecuredAction 中对currentUser 的调用。这也是Play2 Auth使用的技术。

    如果你想避免每次请求都访问数据库,也许是一个返回缓存用户的函数:

    import play.api.cache.Cache
    
    def findByIdentityId(id: Id): Option[User] = ...
    
    def findCachedByIdentityId(id: Id): Option[User] = {
        Cache.getAs[User](s"User.$id").orElse{
            val user: Option[User] = findByIdentityId(id)
            user.foreach(user => Cache.set(s"User.${user.id}"), user)
            user
        }
    }
    

    看看Action Composition也是值得的。

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多