2

我想使用有关当前用户的数据来验证 Play 2 Scala 密码更新表单。想象一个表单,它再次收集当前密码、新密码和新密码。在验证此表单时,应该检查“当前密码”的值是否实际与当前用户的实际密码匹配。在验证中,我需要访问当前用户——这需要访问当前请求。显然,当我定义表单时,请求不在范围内:

val updatePasswordForm = Form(mapping(
"currPassword" -> password,
"newPassword" -> password,
"newPasswordAgain" -> password)(PasswordUpdate.apply)(PasswordUpdate.unapply)
verifying ("passwordsMustMatch", update => update.newPassword == update.newPasswordAgain)
verifying ("incorrectCurrentPassword", pws => authenticate(GAH NEED CURRENT USERS EMAIL, update.currPassword)))

我完全理解在表单验证中具有请求访问权限会为表单引入不需要的依赖项。我只是好奇人们是否有聪明的方法来解决这个问题。到目前为止,我唯一的方法是这样的:

def updatePassword = Action { implicit req =>
  validateCurrentPasswordMatches(updatePasswordForm).bindFromRequest.fold(
  ....

我想要一种将这个依赖于请求的验证打包在共享表单声明中的方法。

4

1 回答 1

4

您可以使用具有隐式定义参数的函数获取更新密码表单,如下所示:Request

def updatePasswordForm(implicit request: Request[_]) = Form(
    // define form here
).verifying(...)

请求参数是从函数隐式传递的bindFromRequest

authenticate函数现在可以访问(再次隐式定义的)请求参数。您需要将其重新定义为

def authenticate( /* old parameters */ )(implicit request: Request[_]): Boolean = {
    // implementation with access to the Request
}
于 2013-02-13T12:12:53.110 回答