Ažuriranje lozinke

Ovaj je članak dio serije: • Proljetni vodič za sigurnosnu registraciju

• Postupak registracije s proljetnom sigurnošću

• Registracija - Aktivirajte novi račun e-poštom

• Proljetna sigurnosna registracija - ponovno pošaljite e-poštu za potvrdu

• Registracija s Spring Security - kodiranje lozinkom

• API za registraciju postaje RESTful

• Proljetna sigurnost - resetirajte lozinku

• Registracija - Snaga lozinke i pravila

• Ažuriranje lozinke (trenutni članak)

1. Pregled

U ovom ćemo kratkom članku implementirati jednostavnu funkciju "Promijeni vlastitu lozinku" dostupnu korisniku nakon što se registrira i prijavi.

2. Na strani klijenta - promijenite stranicu moje lozinke

Pogledajmo vrlo jednostavnu bočnu stranicu klijenta:

 Neusklađenost lozinke Promijeni lozinku var serverContext = [[@ {/}]]; funkcija savePass () {var pass = $ ("# pass"). val (); var vrijedi = pass == $ ("# passConfirm"). val (); ako (! valjano) {$ ("# greška"). show (); povratak; } $ .post (serverContext + "user / updatePassword", {password: pass, oldpassword: $ ("# oldpass"). val ()}, funkcija (podaci) {window.location.href = serverContext + "/ home. html? message = "+ data.message;}) .fail (function (data) {$ (" # errormsg "). show (). html (data.responseJSON.message);}); } 

3. Ažurirajte korisničku lozinku

Ajmo sada implementirati i rad na strani poslužitelja:

@PostMapping ("/ user / updatePassword") @PreAuthorize ("hasRole ('READ_PRIVILEGE')") public GenericResponse changeUserPassword (Locale locale, @RequestParam ("password") Lozinka niza, @RequestParam ("oldpassword") String oldPassword) Korisnik = userService.findUserByEmail (SecurityContextHolder.getContext (). GetAuthentication (). GetName ()); if (! userService.checkIfValidOldPassword (user, oldPassword)) {throw new InvalidOldPasswordException (); } userService.changeUserPassword (korisnik, lozinka); vrati novi GenericResponse (messages.getMessage ("message.updatePasswordSuc", null, locale)); }

Primijetite kako je metoda osigurana putem @PreAuthorize napomena, jer bi trebala dostupno samo prijavljenim korisnicima.

4. API testovi

Na kraju, upotrijebimo API s nekim API testovima kako bismo bili sigurni da sve radi u redu; započet ćemo s jednostavnom konfiguracijom testa i inicijalizacijom podataka:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (klase = {ConfigTest.class, PersistenceJPAConfig.class}, loader = AnnotationConfigContextLoader.class) javna klasa ChangePasswordApiTest {private final String URL_PREFIX: 80 final "String URL_80PREFIX: 80" privatni konačni URL niza = URL_PREFIX + "/ user / updatePassword"; @Autowired privatni UserRepository userRepository; @Autowired privatni PasswordEncoder passwordEncoder; FormAuthConfig formConfig = novi FormAuthConfig (URL_PREFIX + "/ prijava", "korisničko ime", "lozinka"); @Before public void init () {User user = userRepository.findByEmail ("[email protected]"); if (user == null) {user = novi korisnik (); user.setFirstName ("Test"); user.setLastName ("Test"); user.setPassword (passwordEncoder.encode ("test")); user.setEmail ("[e-pošta zaštićena]"); user.setEnabled (true); userRepository.save (korisnik); } else {user.setPassword (passwordEncoder.encode ("test")); userRepository.save (korisnik); }}}

Sada - pokušajmo promijeniti lozinku za prijavljenog korisnika:

@Test javna praznina givenLoggedInUser_whenChangingPassword_thenCorrect () {RequestSpecification request = RestAssured.given (). Auth () .form ("[email protected]", "test", formConfig); Parametri karte = novi HashMap (); params.put ("stara lozinka", "test"); params.put ("lozinka", "novo testiranje"); Odgovor odgovora = request.with (). Params (params) .post (URL); assertEquals (200, response.statusCode ()); assertTrue (response.body (). asString (). contains ("Lozinka je uspješno ažurirana")); }

Dalje - pokušajmo promijeniti lozinku dao pogrešnu staru lozinku:

@Test javna praznina givenWrongOldPassword_whenChangingPassword_thenBadRequest () {RequestSpecification request = RestAssured.given (). Auth () .form ("[email protected]", "test", formConfig); Parametri karte = novi HashMap (); params.put ("stara lozinka", "abc"); params.put ("lozinka", "novo testiranje"); Odgovor odgovora = request.with (). Params (params) .post (URL); assertEquals (400, response.statusCode ()); assertTrue (response.body (). asString (). sadrži ("Nevažeća stara lozinka")); }

Napokon - pokušajmo promijeniti lozinku bez autentifikacije:

@Test javna praznina givenNotAuthenticatedUser_whenChangingPassword_thenRedirect () {Parametri mape = novi HashMap (); params.put ("stara lozinka", "abc"); params.put ("lozinka", "xyz"); Odgovor odgovora = RestAssured.with (). Params (params) .post (URL); assertEquals (302, response.statusCode ()); assertFalse (response.body (). asString (). sadrži ("Lozinka je uspješno ažurirana")); }

Imajte na umu kako - za svaki test - pružamo FormAuthConfig za obradu autentičnosti.

Također resetiramo lozinku putem u tome() kako bismo bili sigurni da koristimo ispravnu lozinku prije testa.

5. Zaključak

I to je omot - jednostavan način da se korisniku omogući promjena vlastite lozinke nakon registracije i prijave u aplikaciju.

The puna provedba ovog vodiča možete pronaći u projektu github - ovo je projekt zasnovan na Eclipseu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.

« Prethodna registracija - Snaga lozinke i pravila

$config[zx-auto] not found$config[zx-overlay] not found