Ich versuche, Benutzer über Remote-Authentifizierungsdienst zu authentifizieren. Ich habe für das Senden von Nachricht an Service-Helfer-Methode geschrieben und warten auf Ergebnis:Play 2 Formular Einschränkung
def authenticateAwait(email: String,
password: String
): Either[String, Option[User]] = {
try {
val future = authenticate(email, password)
Right(Await.result(future, timeout.duration))
} catch {
case _ ⇒ Left("Unable to connect to authentication server")
}
}
Es gibt Left[String]
mit einer Fehlerbeschreibung, wenn die Nachricht nicht gesendet werden kann, oder es gibt keine Antwort. Wenn die Serviceantwort empfangen wurde, wird Right[Option[User]]
zurückgegeben. Der Dienst antwortet mit Option[User]
abhängig vom Authentifizierungsergebnis.
eigentliche Authentifizierung auszuführen I Form mit ein paar Validatoren erstellt haben, hier ist es:
val loginForm = Form(
tuple(
"email" → email,
"password" → nonEmptyText
) verifying ("Invalid email or password", result => result match {
case (email, password) ⇒
User.authenticateAwait(email, password) match {
case Left(_) ⇒ true
case Right(optUser) ⇒ optUser.isDefined
}
}) verifying ("Unable to connect to authentication server", result => result match {
case (email, password) ⇒
User.authenticateAwait(email, password) match {
case Left(_) ⇒ false
case Right(optUser) ⇒ true
}
})
)
Eine Sache, mir diesen Code Sorgen, nennt es authenticateAwait
zweimal. Es bedeutet, dass genau zwei Nachrichten pro einzelne Validierung gesendet werden. Was ich wirklich brauche, ist, einmal die Nummer authenticateAwait
aufzurufen, das Ergebnis zu speichern und verschiedene Validierungen durchzuführen. Es scheint, dass es keine einfache Lösung gibt.
Um die Authentifizierung durchzuführen, müssen Sie auf die erforderlichen Formularfelder zugreifen, dh das Formular muss gebunden und dann validiert werden, aber es gibt keine Möglichkeit, Fehler an das vorhandene Formular anzuhängen (irre ich?).
Fehler können dem Formular nur während seiner Erstellung hinzugefügt werden, daher sollte ich Authentifizierung in den Validatoren durchführen, aber dann tritt das zuvor genannte Problem auf.
Die vorübergehende Lösung, mit der ich kam, ist eine Methode und eine var
darin zu definieren.
def loginForm = {
var authResponse: Either[String, Option[commons.User]] = null
Form(
tuple(
"email" → email,
"password" → nonEmptyText
) verifying ("Invalid email or password", result ⇒ result match {
case (email, password) ⇒
authResponse = User.authenticateAwait(email, password)
authResponse match {
case Left(_) ⇒ true
case Right(optUser) ⇒ optUser.isDefined
}
}) verifying ("Unable to connect to authentication server", result ⇒ result match {
case (email, password) ⇒
authResponse match {
case Left(_) ⇒ false
case Right(optUser) ⇒ true
}
})
)
}
Dies ist eindeutig ein Hack. Gibt es bessere Lösungen?
Update: Meiner Meinung nach Formular sollte nur Eingabe bereinigen, aber die Authentifizierung sollte später außerhalb des Formulars durchgeführt werden. Das Problem ist, dass Fehler an die Ansicht als Teil der Form
gesendet werden und es ist unmöglich, Fehler an das vorhandene Formular anzuhängen. Es gibt keine einfache Möglichkeit, ein neues Formular mit Fehlern zu erstellen.
es heißt AJAX; Verwenden Sie es und Sie werden keine ginormous Codeblöcke erstellen, die versuchen, ein Problem zu lösen, das nicht existiert (Hinweis: es besteht keine Notwendigkeit, ein neues Formular zu erstellen) – virtualeyes