如何在创建用户后更新securesocial用户名

时间:2013-08-08 12:23:28

标签: scala playframework securesocial

我正在尝试编写一个editUser页面,其中包含在Play Framework应用程序中实现的Secure Social插件。用户名更改后我无法保持登录状态。更改用户名后,如果我按edit for editUser表单,则会出现此问题。它进入登录页面并说“您需要登录才能访问该页面”。所需的行为是重定向到editUser页面而无需重新登录。在数据库中,一切都已成功更新。这样就行了,它就不再登录了。

以下是我的“用户”控制器的控制器方法,用于用户更新的POST。

如果有人能帮我解决这个问题,我将不胜感激。感谢。

// The form uses the following case class
case class AccountInfo(userName: String, firstName: String, lastName: String, email: Option[String]) 

def update(username: String) = SecuredAction { implicit request =>
    this.editAccountForm.bindFromRequest.fold (
      hasErrors = { info =>
        Redirect(routes.Users.edit()).flashing(Flash(editAccountForm.data) +
          ("error" -> Messages("validation.errors")))
      },
      success = { info =>
        DB.withSession { implicit s: Session =>
          val uid = User.currentUser(request.user.id.id,providerId).get.uid
          User.update(uid, info, providerId)
        }
        val message = Messages("user.update.success")

        Redirect(routes.Users.edit()).flashing("success" -> message)
          .withCookies(request.cookies.get("id").get)
      }
    )
  }

1 个答案:

答案 0 :(得分:1)

通过更改用户名,您将更改用于标识用户的值(用户名+提供商ID)。发生的事情是,在下一个请求中,SecureSocial正在寻找旧的用户名,因为它无法在数据库中找到它,它只会把你踢出去。

除了更新数据库之外,您应该做的是更新为当前会话存储的Authenticator。类似的东西:

SecureSocial.authenticatorFromRequest(request).map { authenticator =>
    val newId = request.user.id.copy( id = userName )
    Authenticator.save(authenticator.copy( userId = newId))
}

这应该让它发挥作用。此外,您无需将ID cookie添加到重定向。 SecureSocial为您做到了这一点。