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.

È stato utile?

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
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top