Доступ к текущему запросу в ограничениях формы
-
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
}