Доступ к текущему запросу в ограничениях формы

StackOverflow https://stackoverflow.com//questions/12694529

  •  12-12-2019
  •  | 
  •  

Вопрос

Я хотел бы проверить форму обновления пароля 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(
  ....

Мне бы хотелось упаковать эту проверку, зависящую от запроса, прямо внутри объявления общей формы.

Это было полезно?

Решение

Вы можете получить форму обновления пароля, используя функция с неявно определенным 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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top