Aggiornamento della tua password

Questo articolo fa parte di una serie: • Esercitazione sulla registrazione di Spring Security

• Il processo di registrazione con Spring Security

• Registrazione: attiva un nuovo account tramite e-mail

• Registrazione Spring Security - Invia di nuovo l'e-mail di verifica

• Registrazione con Spring Security - Codifica password

• L'API di registrazione diventa RESTful

• Spring Security - Reimposta la tua password

• Registrazione - Forza della password e regole

• Aggiornamento della password (articolo attuale)

1. Panoramica

In questo rapido articolo implementeremo una semplice funzionalità "Modifica la mia password" disponibile per l'utente dopo la registrazione e l'accesso.

2. Lato client - Modifica la pagina della mia password

Diamo un'occhiata alla semplicissima pagina lato client:

 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. Aggiorna password utente

Implementiamo ora anche l'operazione lato server:

@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)); }

Notare come il metodo è protetto tramite l' annotazione @PreAuthorize , poiché dovrebbe essere accessibile solo agli utenti che hanno effettuato l'accesso .

4. Test API

Infine, utilizziamo l'API con alcuni test API per assicurarci che tutto funzioni correttamente; inizieremo con la semplice configurazione del test e l'inizializzazione dei dati:

@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); } } }

Ora, proviamo a cambiare la password per un utente connesso :

@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")); }

Avanti - proviamo a cambiare la password data una vecchia password sbagliata :

@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")); }

Infine, proviamo a cambiare la password senza autenticazione :

@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")); }

Nota come, per ogni test, forniamo un FormAuthConfig per gestire l'autenticazione.

Stiamo anche reimpostando la password tramite init () per assicurarci di utilizzare la password corretta prima del test.

5. conclusione

E questo è tutto: un modo semplice per consentire all'utente di modificare la propria password dopo la registrazione e l'accesso all'applicazione.

L' implementazione completa di questo tutorial può essere trovata nel progetto github: questo è un progetto basato su Eclipse, quindi dovrebbe essere facile da importare ed eseguire così com'è.

« Registrazione precedente - Forza della password e regole