Aktualisieren Sie Ihr Passwort

1. Überblick

In diesem kurzen Artikel implementieren wir eine einfache Funktion zum Ändern des eigenen Passworts, die dem Benutzer nach der Registrierung und Anmeldung zur Verfügung steht.

2. Client-Seite - Passwortseite ändern

Schauen wir uns die sehr einfache Seite des Kunden an:

<html>
<body>
<div id="errormsg" style="display:none"></div>
<div>
    <input id="oldpass" name="oldpassword" type="password"/>
    <input id="pass" name="password" type="password"/>
    <input id="passConfirm" type="password"/>
    <span id="error" style="display:none">Password mismatch</span>

   <button type="submit" onclick="savePass()">Change Password</button>
</div>

<script src="jquery.min.js"></script>
<script type="text/javascript">

var serverContext =[[@{/}]];
function savePass(){
    var pass = $("#pass").val();
    var valid = pass == $("#passConfirm").val();
    if(!valid) {
      $("#error").show();
      return;
    }
    $.post(serverContext + "user/updatePassword",
      {password: pass, oldpassword: $("#oldpass").val()} ,function(data){
        window.location.href = serverContext +"/home.html?message="+data.message;
    })
    .fail(function(data) {
        $("#errormsg").show().html(data.responseJSON.message);
    });
}
</script>
</body>
</html>

3. Benutzerpasswort aktualisieren

Lassen Sie uns nun auch die serverseitige Operation implementieren:

@RequestMapping(value = "/user/updatePassword", method = RequestMethod.POST)
@PreAuthorize("hasRole('READ__PRIVILEGE')")
@ResponseBody
public GenericResponse changeUserPassword(Locale locale,
  @RequestParam("password") String password,
  @RequestParam("oldpassword") String oldPassword) {
    User user = userService.findUserByEmail(
      SecurityContextHolder.getContext().getAuthentication().getName());

    if (!userService.checkIfValidOldPassword(user, oldPassword)) {
        throw new InvalidOldPasswordException();
    }
    userService.changeUserPassword(user, password);
    return new GenericResponse(messages.getMessage("message.updatePasswordSuc", null, locale));
}

Beachten Sie, wie die Methode durch die Annotation @ PreAuthorize gesichert wird, da sie nur für angemeldete Benutzer zugänglich sein sollte.

4. API-Tests

Schließlich wollen wir die API mit einigen API-Tests verwenden, um sicherzustellen, dass alles einwandfrei funktioniert. Wir beginnen mit der einfachen Konfiguration des Tests und der Dateninitialisierung:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
  classes = { ConfigTest.class, PersistenceJPAConfig.class },
  loader = AnnotationConfigContextLoader.class)
public class ChangePasswordApiTest {
    private final String URL__PREFIX = "http://localhost:8080/";
    private final String URL = URL__PREFIX + "/user/updatePassword";

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private PasswordEncoder passwordEncoder;

    FormAuthConfig formConfig = new FormAuthConfig(
      URL__PREFIX + "/login", "username", "password");

    @Before
    public void init() {
        User user = userRepository.findByEmail("[email protected]");
        if (user == null) {
            user = new User();
            user.setFirstName("Test");
            user.setLastName("Test");
            user.setPassword(passwordEncoder.encode("test"));
            user.setEmail("[email protected]");
            user.setEnabled(true);
            userRepository.save(user);
        } else {
            user.setPassword(passwordEncoder.encode("test"));
            userRepository.save(user);
        }
    }
}

Nun - versuchen wir das Passwort eines angemeldeten Benutzers zu ändern :

@Test
public void givenLoggedInUser__whenChangingPassword__thenCorrect() {
    RequestSpecification request = RestAssured.given().auth()
      .form("[email protected]", "test", formConfig);

    Map<String, String> params = new HashMap<String, String>();
    params.put("oldpassword", "test");
    params.put("password", "newtest");

    Response response = request.with().params(params).post(URL);

    assertEquals(200, response.statusCode());
    assertTrue(response.body().asString().contains("Password updated successfully"));
}

Weiter - versuchen wir, das Passwort zu ändern mit einem falschen alten Passwort :

@Test
public void givenWrongOldPassword__whenChangingPassword__thenBadRequest() {
    RequestSpecification request = RestAssured.given().auth()
      .form("[email protected]", "test", formConfig);

    Map<String, String> params = new HashMap<String, String>();
    params.put("oldpassword", "abc");
    params.put("password", "newtest");

    Response response = request.with().params(params).post(URL);

    assertEquals(400, response.statusCode());
    assertTrue(response.body().asString().contains("Invalid Old Password"));
}

Schließlich - versuchen wir, das Kennwort ohne Authentifizierung zu ändern:

@Test
public void givenNotAuthenticatedUser__whenChangingPassword__thenRedirect() {
    Map<String, String> params = new HashMap<String, String>();
    params.put("oldpassword", "abc");
    params.put("password", "xyz");

    Response response = RestAssured.with().params(params).post(URL);

    assertEquals(302, response.statusCode());
    assertFalse(response.body().asString().contains("Password updated successfully"));
}

Beachten Sie, wie wir für jeden Test ein FormAuthConfig zur Verfügung stellen, um die Authentifizierung durchzuführen.

Wir setzen das Passwort auch über init () zurück, um sicherzustellen, dass vor dem Test das richtige Passwort verwendet wird.

5. Fazit

Und das ist ein Wrap - eine unkomplizierte Möglichkeit, dass der Benutzer sein eigenes Passwort nach der Registrierung und Anmeldung bei der Anwendung ändern kann

Die vollständige Implementierung dieses Tutorials finden Sie unter https://github.com/eugenp/spring-security-registration (das github-Projekt) - Dies ist ein auf Eclipse basierendes Projekt es ist.

  • "** Bisherige