Mettre à jour votre mot de passe

Cet article fait partie d'une série: • Didacticiel d'enregistrement Spring Security

• Le processus d'inscription avec Spring Security

• Inscription - Activez un nouveau compte par e-mail

• Enregistrement Spring Security - Renvoyer l'e-mail de vérification

• Enregistrement avec Spring Security - Codage du mot de passe

• L'API d'inscription devient RESTful

• Spring Security - Réinitialisez votre mot de passe

• Enregistrement - Force et règles du mot de passe

• Mise à jour de votre mot de passe (article actuel)

1. Vue d'ensemble

Dans cet article rapide, nous mettrons en œuvre une fonctionnalité simple «Changer mon mot de passe» disponible pour l'utilisateur après son inscription et sa connexion.

2. Côté client - Page Modifier mon mot de passe

Jetons un coup d'œil à la page côté client très simple:

 Password mismatch Change Password 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); }); }   

3. Mettre à jour le mot de passe de l'utilisateur

Implémentons maintenant également l'opération côté serveur:

@PostMapping("/user/updatePassword") @PreAuthorize("hasRole('READ_PRIVILEGE')") 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)); }

Notez comment la méthode est sécurisée via l' annotation @PreAuthorize , car elle ne doit être accessible qu'aux utilisateurs connectés .

4. Tests API

Enfin, consommons l'API avec quelques tests d'API pour nous assurer que tout fonctionne correctement; nous allons commencer par la configuration simple du test et l'initialisation des données:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( classes = { ConfigTest.class, PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class) public class ChangePasswordApiTest { private final String URL_PREFIX = "//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); } } }

Maintenant, essayons de changer le mot de passe d'un utilisateur connecté :

@Test public void givenLoggedInUser_whenChangingPassword_thenCorrect() { RequestSpecification request = RestAssured.given().auth() .form("[email protected]", "test", formConfig); Map params = new HashMap(); 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")); }

Ensuite - essayons de changer le mot de passe si l'ancien mot de passe est incorrect :

@Test public void givenWrongOldPassword_whenChangingPassword_thenBadRequest() { RequestSpecification request = RestAssured.given().auth() .form("[email protected]", "test", formConfig); Map params = new HashMap(); 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")); }

Enfin - essayons de changer le mot de passe sans authentification :

@Test public void givenNotAuthenticatedUser_whenChangingPassword_thenRedirect() { Map params = new HashMap(); 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")); }

Notez comment - pour chaque test - nous fournissons un FormAuthConfig pour gérer l'authentification.

Nous réinitialisons également le mot de passe via init () pour nous assurer que nous utilisons le bon mot de passe avant le test.

5. Conclusion

Et c'est une solution - un moyen simple de permettre à l'utilisateur de modifier son propre mot de passe après son inscription et sa connexion à l'application.

L' implémentation complète de ce didacticiel se trouve dans le projet github - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.

« Inscription précédente - Force et règles du mot de passe