2013-06-20 14 views
13

Ich fand es sehr schwierig, Passwort-Wiederherstellung zu tun, da ich es noch nie zuvor getan habe.Leitfaden zur Implementierung der Feder Sicherheit Passwort-Wiederherstellung mit dynamischen URL an die E-Mail geschickt

Bisher habe ich Web-App, die hat:

Spring Security, wo das Kennwort richtig gehasht und Benutzerrollen implementiert und korrekt funktionieren.

Die Strategie deutet Forschung von Stackoverflow:

  1. User Zugriffe vergessen Passwort-Taste, wo er seine E-Mail-Adresse eingibt.
  2. Dynamic Link wird an E-Mail-Adresse gesendet öffnet
  3. User-Link in E-Mail-Adresse
  4. die ihn Reset Seite Passwort umleitet

Was nicht bekannt ist:

  • Wie Link zu geben, dynamische Natur - Methoden der Generationen
  • Link hat eine Zeitüberschreitung - einige Fragen wurden hier gefunden, aber oft beinhalten benutzerdefinierte Handler oder Erweiterung auf Feder Sec urity-Funktionalität
  • Eine Anforderungszuordnungsmethode, um auf eine solche dynamische Verbindung zu antworten
  • Temporäre Verbindungsspeichermethoden - Datenbank, Sitzung usw.?

Wie Sie sehen können, ist die Liste für eine einzelne Frage ziemlich streng. Ich hatte also gehofft, dass Sie Schritt für Schritt Anleitungen zur Verfügung stellen könnten. Ich war ein wenig überrascht, dass ich in der Spring Security-Dokumentation nicht viel darüber finden konnte. Vielen Dank.

Ich bin Student, also weiß nicht wirklich Best Practices der Branche dafür besonders im Zusammenhang mit Java, so dass ich wirklich hoffe, dass jeder in der Lage sein wird zu helfen.

+0

Ich habe ein JAVA-Projekt für diesen Anwendungsfall implementiert. Es ist auf GitHub, Open Source. Sie können einen Blick darauf werfen: https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows – OhadR

Antwort

18

Das Problem hat nicht wirklich viel mit Spring Security zu tun. Vorausgesetzt, Sie kennen die Struktur der Benutzerdatenbank und des verwendeten Passwort-Encoders, wird lediglich ein Workflow mit Datenzugriff, Web-Controllern und dem Senden einer E-Mail implementiert. Der Link sollte eine zufällige Token-Zeichenfolge enthalten (z. B. SecureRandom und einen base64-Encoder). Er sollte in einer Datenbank mit der userId und einem Zeitstempel gespeichert werden (um das Fenster zu validieren, in dem die Verknüpfung gültig ist). Der Controller würde einfach das Token aus der eingehenden Anfrage extrahieren, die Daten mit dem Token aus der Datenbank laden. Es würde den Zeitstempel überprüfen und den Benutzer dann an ein Passwort-Eingabeformular weiterleiten. Abhängig von den Anforderungen möchten Sie möglicherweise auch, dass sie einige andere Sicherheitsfragen beantworten. Sie würden dann das Passwort validieren und kodieren und es in dem Account speichern, der mit der Benutzer-ID übereinstimmt, die in der Reset-Verknüpfungstabelle gespeichert ist. Es wäre auch sinnvoll, einen Batch-Job auszuführen, um abgelaufene Links aus der Datenbank zu entfernen.

Das Grails Spring Security UI Plugin hat bereits eine forgot password Option, die Sie entweder direkt verwenden oder als Referenz verwenden können.

+0

groß, einfach und prägnant. Ich glaube, dass E-Mail-Adresse + Timestamp (als Salz) Hash-Generation würde die Arbeit für die Link-Generierung tun? Auch nur für eine schnelle Referenz auf dynamischen Link zu reagieren verwende ich etwas wie: \t @RequestMapping (Wert = "/ var/{Name}", Methode = RequestMethod.GET) – Aubergine

+0

Könnten Sie bestätigen, dass bitte bevor ich akzeptiere? :-) – Aubergine

+0

Warum einen Hash verwenden? Sie müssen das Token trotzdem speichern, um es zu überprüfen und Zeitstempel zu erraten. Wenn ich wüsste, dass jemand einen Reset angefordert hat und ihre E-Mail-Adresse kannte, könnte ich einfach alle möglichen Zeitstempel über ein passendes Fenster durchlaufen, bis das System mich hereingelassen hat. Benutze zufällige Bytes für den Link-Token und mache es lang genug, dass du es nicht tust. Ich muss mich darum sorgen (zB 16 Bytes). –

5

Ich habe ein JAVA-Projekt für diesen Anwendungsfall implementiert. Es ist auf GitHub, Open Source.

Es gibt Erklärungen für alles (und wenn etwas fehlt - lass es mich wissen ...

) Haben


einen Blick: https://github.com/OhadR/Authentication-Flows

Dies ist die Client-Web-Anwendung, die den Auth-Flows, mit der Readme mit allen Erklärungen verwendet. es leitet Sie die Implementierung: https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows

+0

Ist das stabil genug, um sich für den Produktionseinsatz anzupassen? – Kafkaesque

+0

es ist eine gute Frage. Kurz gesagt: JA. Beachten Sie, dass für die Produktion jeder (normalerweise) seine eigenen Bedürfnisse hat. Zum Beispiel gibt es Unternehmen, die "geheime Frage" -Mechanismus brauchen, den ich nicht implementiert habe. aber es ist eine sehr gute Grundlage, um von allem zu beginnen und hinzuzufügen. Schau in die README. lassen Sie mich wissen, wenn etwas nicht klar ist. und ja - es ist stabil :-) HINWEIS: Ich habe die Links in meiner Antwort geändert. Schau mal .. – OhadR

+0

Hi @OhadR: Ich verweise auf dein Projekt, es ist nützlich für mich, ich habe eine Ausnahme erhalten: AuthenticationFlowsProcessorImpl - Authentifizierung fehlgeschlagen; verschachtelte Ausnahme ist javax.mail.AuthenticationFailedException, UserActionController - Konto ist gesperrt oder existiert nicht, ich habe überprüft und Benutzerdaten in db eingefügt –