Java >> Java Tutorial >  >> Tag >> Spring

Funktion „Passwort vergessen“ in der Spring Boot-Anwendung

In diesem Beitrag zeigen wir, wie Sie eine Funktion für vergessene Passwörter für Ihre Spring Boot-Anwendung implementieren. In meinem alten Beitrag hatte ich gezeigt, wie man ein Social Login für eine Anwendung erstellt.

Die meisten Webanwendungen haben eine Seite für vergessene Passwörter, und es gibt unterschiedliche Richtlinien zur Passworterstellung und zum Zurücksetzen des Passworts. Insgesamt können Sie davon ausgehen, dass Benutzer ein Passwort vergessen und das Passwort zurücksetzen müssen.

Flow für vergessenes Passwort

  1. Der Benutzer besucht den Anmeldebildschirm und klickt auf die Option „Passwort vergessen“.
  2. Der Benutzer gibt die E-Mail-Adresse in das Feld „Passwort vergessen“ ein.
  3. Auf der Serverseite überprüfen wir, ob ein Benutzer mit dieser E-Mail existiert oder nicht.
  4. Auf der Serverseite erstellen wir ein zeitgebundenes Sicherheits-Reset-Token, das diesem Benutzer zugeordnet ist, und senden es per E-Mail, sofern der Benutzer existiert.
  5. Der Benutzer erhält eine E-Mail zum Zurücksetzen des Passworts.
  6. Sobald der Benutzer auf den Link zum Zurücksetzen des Passworts klickt, der das Zurücksetzungstoken enthält.
  7. Der Benutzer leitet zu einer Seite weiter, auf der der Benutzer das Passwort zurücksetzen kann.
  8. Dann reicht der Benutzer ein neues Passwort zusammen mit dem Reset-Token ein. Basierend auf dem Reset-Token überprüfen wir zuerst, ob der Benutzer korrekt ist, und speichern dann das neue Passwort.
  9. Benutzer leitet zur Anmeldeseite weiter.

Nachdem wir nun den Ablauf beschrieben haben, können wir zeigen, wie diese Funktion implementiert wird.

Benutzeroberfläche „Passwort vergessen“

Ein Bildschirm, in dem der Benutzer eine E-Mail-Adresse eingibt, um das Passwort zurückzusetzen, sieht wie folgt aus:

Passwort vergessen

Sobald der Benutzer seine E-Mail-Adresse eingibt, überprüft die serverseitige Implementierung, ob ein Benutzer mit dieser E-Mail existiert oder nicht. In LoginController , dieser Beitrag von Reset Password wird wie folgt aussehen:


        String email = ServletUtil.getAttribute(request, "email");
        User user = userRepository.findUserByEmail(email);

        if(user == null)
        {
            model.addAttribute("error", "We didn't find this user");
            return "forgotpassword";
        }
        PasswordResetToken token = new PasswordResetToken();
        token.setToken(UUID.randomUUID().toString());
        token.setUser(user);
        token.setExpiryDate(30);
        passwordResetTokenRepository.save(token);
        
        Mail mail = new Mail();
        Map modelObj = new HashMap<>();
        modelObj.put("token",token);
        modelObj.put("user", user);
        String url =
                request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
        modelObj.put("resetUrl", url + "/resetpassword?token=" + token.getToken());
        mail.setModel(modelObj);
        emailService.sendEmail(mail);

Wie Sie in diesem Code sehen token Das Objekt wird dem Benutzer eins zu eins zugeordnet. Sobald der Benutzer die E-Mail-Adresse übermittelt hat, senden wir ihm eine E-Mail zum Zurücksetzen des Passworts mit URL.

Diese E-Mail sieht also wie folgt aus:

Sobald der Benutzer auf den Link aus der E-Mail klickt, wird der Benutzer zu einem Formular umgeleitet, um ein neues Passwort einzugeben. Beim Anzeigen des Formulars wird zuerst das Reset-Token validiert, wenn es nicht abgelaufen ist und existiert. GET Anfrage zum Zurücksetzen des Formulars zeigt das Formular an.

POST Anfrage sendet das Formular zum Zurücksetzen des Benutzerkennworts.


    @GetMapping
    public String getPasswordResetPage(@RequestParam(required=false) String token, Model model)
    {
        PasswordResetToken passwordResetToken = passwordResetTokenRepository.findByToken(token);
        if(passwordResetToken == null)
        {
            model.addAttribute("error","Could not find reset token");
        }
        else if(passwordResetToken.isExpired())
        {
            model.addAttribute("error","Reset Token is expired");
        }
        else
        {
            model.addAttribute("token",passwordResetToken.getToken());
        }
        return "resetpassword";
    }

    @PostMapping
    public String handlePasswordReset(HttpServletRequest request, Model model)
    {
        String token = ServletUtil.getAttribute(request, "token");
        PasswordResetToken passwordResetToken = passwordResetTokenRepository.findByToken(token);
        User user = passwordResetToken.getUser();
        String password = ServletUtil.getAttribute(request, "password");
        String confirmPassword = ServletUtil.getAttribute(request, "confirmPassword");
        
        user.setPassword(updatedPassword);
        user.setPasswordConfirm(updatedPassword);
        userRepository.save(user);
        passwordResetTokenRepository.delete(passwordResetToken);

        return "redirect:/login?resetSuccess";

    }

Nachdem das neue Passwort gespeichert wurde, wird das Reset-Token gelöscht, sodass es nicht wiederverwendet werden kann.

Schlussfolgerung

In diesem Beitrag haben wir gezeigt, wie man die User Story von Passwort vergessen implementiert. Es gibt in der Regel verschiedene Möglichkeiten, das Passwort zurückzusetzen. Es hängt hauptsächlich davon ab, welche Passwortrichtlinien Sie anpassen.

Referenzen

  1. Funktion „Passwort vergessen“ – Passwort vergessen


Java-Tag