Accedi alla richiesta corrente nei vincoli del modulo
-
12-12-2019 - |
Domanda
Vorrei convalidare un modulo di aggiornamento della password di Play 2 Scala utilizzando i dati sull'utente corrente.Immagina un modulo che raccoglie la password corrente, nuova password e nuova password.Su convalida di questo modulo dovrebbe essere se il valore per "password corrente" corrisponde in realtà la password effettiva degli utenti attuali.Nella convalida, avrò bisogno di accesso all'attuale utente, che richiede l'accesso alla richiesta corrente.Ovviamente la richiesta non è in ambito quando definisco il modulo:
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)))
.
Apprezzo completamente che avesse la richiesta di accesso nella convalida del modulo introdurrebbe una dipendenza indesiderata per le forme.Sono solo curioso se le persone abbiano un modo intelligente attorno a questo.Il mio unico approccio finora è qualcosa del genere:
def updatePassword = Action { implicit req =>
validateCurrentPasswordMatches(updatePasswordForm).bindFromRequest.fold(
....
.
Avere un modo per il pacchetto di questa convalida dipendente dalla richiesta direttamente all'interno della Dichiarazione della forma condivisa.
Soluzione
È possibile ottenere il modulo di password di aggiornamento utilizzando una funzione con un parametro Request
implicitamente definito come:
def updatePasswordForm(implicit request: Request[_]) = Form(
// define form here
).verifying(...)
.
Il parametro di richiesta è implicitamente passato dalla funzione bindFromRequest
.
La funzione authenticate
ora ha accesso al parametro di richiesta (di nuovo definito implicitamente).Devi ri-definirlo come
def authenticate( /* old parameters */ )(implicit request: Request[_]): Boolean = {
// implementation with access to the Request
}
.