Pergunta

Gostaria de validar um formulário de atualização de senha do Play 2 Scala usando dados sobre o usuário atual.Imagine um formulário que coleta a senha atual, a nova senha e a nova senha novamente.Na validação deste formulário deve-se verificar se o valor da "senha atual" realmente corresponde à senha real do usuário atual.Na validação, precisarei de acesso ao usuário atual - o que requer acesso à solicitação atual.Obviamente request não está no escopo quando defino o formulário:

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)))

Compreendo perfeitamente que ter acesso Request na validação de formulário introduziria uma dependência indesejada para Formulários.Só estou curioso para saber se as pessoas têm uma maneira inteligente de contornar isso.Minha única abordagem até agora é algo assim:

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

Eu adoraria empacotar essa validação dependente de solicitação diretamente na declaração de formulário compartilhada.

Foi útil?

Solução

Você pode obter seu formulário de atualização de senha usando um função com um implicitamente definido Request parâmetro assim:

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

O parâmetro de solicitação é passado implicitamente do bindFromRequest função.

O authenticate função agora tem acesso ao parâmetro de solicitação (novamente definido implicitamente).Você precisa redefini-lo como

def authenticate( /* old parameters */ )(implicit request: Request[_]): Boolean = {
    // implementation with access to the Request
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top