Frage

Ich möchte ein Formular zur Aktualisierung des Play 2 Scala-Passworts anhand von Daten zum aktuellen Benutzer validieren.Stellen Sie sich ein Formular vor, das das aktuelle Passwort, das neue Passwort und das neue Passwort erneut sammelt.Bei der Validierung dieses Formulars sollte angegeben werden, ob der Wert für "aktuelles Passwort" tatsächlich mit dem aktuellen Passwort des Benutzers übereinstimmt.Bei der Validierung benötige ich Zugriff auf den aktuellen Benutzer - was Zugriff auf die aktuelle Anforderung erfordert.Offensichtlich ist die Anfrage nicht im Geltungsbereich, wenn ich das Formular definiere:

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

Ich weiß es voll und ganz zu schätzen, dass ein Anforderungszugriff bei der Formularvalidierung eine unerwünschte Abhängigkeit für Formulare mit sich bringen würde.Ich bin nur neugierig, ob die Leute einen cleveren Weg finden, das zu umgehen.Mein bisher einziger Ansatz ist so etwas:

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

Ich würde gerne eine Möglichkeit finden, diese anforderungsabhängige Validierung direkt in die Deklaration des freigegebenen Formulars zu packen.

War es hilfreich?

Lösung

Sie können Ihr Update-Passwort-Formular mit einem Funktion mit einer implizit definierten Request parameter wie folgt:

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

Der Anforderungsparameter wird implizit von der übergeben bindFromRequest Funktion.

Der authenticate funktion hat nun Zugriff auf den (wieder implizit definierten) Anforderungsparameter.Sie müssen es neu definieren als

def authenticate( /* old parameters */ )(implicit request: Request[_]): Boolean = {
    // implementation with access to the Request
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top