Opdatering af din adgangskode

Denne artikel er en del af en serie: • Vejledning i Spring Security Registration

• Registreringsprocessen med forårssikkerhed

• Registrering - Aktiver en ny konto via e-mail

• Forårsikkerhedsregistrering - Send bekræftelses-e-mail igen

• Registrering med Spring Security - kodning af adgangskode

• Registrerings-API'en bliver RESTful

• Spring Security - Nulstil din adgangskode

• Registrering - adgangskodestyrke og regler

• Opdatering af din adgangskode (nuværende artikel)

1. Oversigt

I denne hurtige artikel implementerer vi en simpel “Skift min egen adgangskode” -funktionalitet, der er tilgængelig for brugeren, efter at de har registreret og logget ind.

2. Klientside - Skift min adgangskode-side

Lad os se på den meget enkle klientsideside:

 Adgangskodefejl Ændring af kodeord var serverContext = [[@ {/}]]; funktion savePass () {var pass = $ ("# pass"). val (); var valid = pass == $ ("# passConfirm"). val (); hvis (! gyldig) {$ ("# fejl"). vis (); Vend tilbage; } $ .post (serverContext + "user / updatePassword", {password: pass, oldpassword: $ ("# oldpass"). val ()}, funktion (data) {window.location.href = serverContext + "/ home. html? message = "+ data.message;}). mislykkedes (funktion (data) {$ (" # errormsg "). show (). html (data.responseJSON.message);}); } 

3. Opdater brugeradgangskode

Lad os nu også implementere serversiden:

@PostMapping ("/ user / updatePassword") @PreAuthorize ("hasRole ('READ_PRIVILEGE')") public GenericResponse changeUserPassword (Locale locale, @RequestParam ("password") Adgangskode for streng, @RequestParam ("oldpassword") String oldPassword) Brugerbruger = userService.findUserByEmail (SecurityContextHolder.getContext (). GetAuthentication (). GetName ()); hvis (! userService.checkIfValidOldPassword (bruger, oldPassword)) {smid nyt InvalidOldPasswordException (); } userService.changeUserPassword (bruger, adgangskode); returner nye GenericResponse (messages.getMessage ("message.updatePasswordSuc", null, locale)); }

Bemærk hvordan metoden er sikret via @PreAuthorize kommentar, da det skulle kun tilgængelig for indloggede brugere.

4. API-test

Lad os endelig forbruge API'en med nogle API-tests for at sikre, at alt fungerer fint; vi starter med den enkle konfiguration af testen og datainitialiseringen:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (classes = {ConfigTest.class, PersistenceJPAConfig.class}, loader = AnnotationConfigContextLoader.class) public class ChangePasswordApiTest {private final String URL_PREFIX = "// /80 privat endelig streng URL = URL_PREFIX + "/ bruger / updatePassword"; @Autowired privat UserRepository userRepository; @Autowired privat PasswordEncoder passwordEncoder; FormAuthConfig formConfig = ny FormAuthConfig (URL_PREFIX + "/ login", "brugernavn", "adgangskode"); @Før offentlig ugyldig init () {Brugerbruger = brugerRepository.findByEmail ("[e-mailbeskyttet]"); hvis (bruger == null) {bruger = ny bruger (); user.setFirstName ("Test"); user.setLastName ("Test"); user.setPassword (passwordEncoder.encode ("test")); user.setEmail ("[email protected]"); user.setEnabled (true); userRepository.save (bruger); } andet {user.setPassword (passwordEncoder.encode ("test")); userRepository.save (bruger); }}}

Nu - lad os prøve at skift adgangskode til en logget bruger:

@Test offentligt ugyldigt givenLoggedInUser_whenChangingPassword_thenCorrect () {RequestSpecification request = RestAssured.given (). Auth () .form ("[email protected]", "test", formConfig); Kortparametre = nyt HashMap (); params.put ("oldpassword", "test"); params.put ("adgangskode", "nyeste test"); Svarrespons = anmodning.med (). Params (params) .post (URL); assertEquals (200, respons.statusCode ()); assertTrue (respons.body (). asString (). indeholder ("Adgangskode opdateret med succes")); }

Næste - lad os prøve at ændre adgangskoden givet en forkert gammel adgangskode:

@Test offentlig ugyldighed givenWrongOldPassword_whenChangingPassword_thenBadRequest () {RequestSpecification request = RestAssured.given (). Auth () .form ("[email protected]", "test", formConfig); Kortparametre = nyt HashMap (); params.put ("oldpassword", "abc"); params.put ("adgangskode", "nyeste test"); Svarrespons = anmodning.med (). Params (params) .post (URL); assertEquals (400, respons.statusCode ()); assertTrue (respons.body (). asString (). indeholder ("Ugyldig gammel adgangskode")); }

Endelig - lad os prøve at ændre adgangskoden uden godkendelse:

@Test offentlig ugyldighed givenNotAuthenticatedUser_whenChangingPassword_thenRedirect () {Map params = new HashMap (); params.put ("oldpassword", "abc"); params.put ("adgangskode", "xyz"); Svarrespons = RestAssured.with (). Params (params) .post (URL); assertEquals (302, respons.statusCode ()); assertFalse (respons.body (). asString (). indeholder ("Adgangskode opdateret med succes")); }

Bemærk hvordan vi - for hver test - leverer en FormAuthConfig til at håndtere godkendelsen.

Vi nulstiller også adgangskoden via i det() for at sikre, at vi bruger den korrekte adgangskode før test.

5. Konklusion

Og det er en wrap - en ligetil måde at give brugeren mulighed for at ændre deres egen adgangskode efter at have registreret og logget ind på applikationen.

Det fuld implementering af denne vejledning kan findes i github-projektet - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.

« Tidligere registrering - adgangskodestyrke og regler

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