Aktualizácia hesla

Tento článok je súčasťou série: • Výukový program pre jarnú registráciu zabezpečenia

• Proces registrácie s jarnou bezpečnosťou

• Registrácia - aktivácia nového účtu e-mailom

• Jarná bezpečnostná registrácia - opätovné odoslanie overovacieho e-mailu

• Registrácia s Spring Security - kódovanie hesla

• Registračné API sa stáva RESTful

• Jarná bezpečnosť - obnovte svoje heslo

• Registrácia - sila hesla a pravidlá

• Aktualizácia hesla (aktuálny článok)

1. Prehľad

V tomto rýchlom článku implementujeme jednoduchú funkciu „Zmeniť moje vlastné heslo“, ktorá je k dispozícii používateľovi po registrácii a prihlásení.

2. Strana klienta - stránka Zmena hesla

Pozrime sa na veľmi jednoduchú bočnú stránku klienta:

 Nesúlad hesla Zmeniť heslo var serverContext = [[@ {/}]]; funkcia savePass () {var pass = $ ("# pass"). val (); var valid = pass == $ ("# passConfirm"). val (); if (! valid) {$ ("# chyba"). show (); návrat; } $ .post (serverContext + "user / updatePassword", {heslo: heslo, staré heslo: $ ("# staré heslo"). val ()}, funkcia (údaje) {window.location.href = serverContext + "/ home. html? message = "+ data.message;}) .fail (function (data) {$ (" # errormsg "). show (). html (data.responseJSON.message);}); } 

3. Aktualizujte heslo používateľa

Poďme teraz implementovať aj operáciu na strane servera:

@PostMapping ("/ user / updatePassword") @PreAuthorize ("hasRole ('READ_PRIVILEGE')") verejné GenericResponse changeUserPassword (miestne nastavenie, @RequestParam ("heslo") reťazec heslo, @RequestParam ("staré heslo") reťazec oldPassword Používateľ user = userService.findUserByEmail (SecurityContextHolder.getContext (). GetAuthentication (). GetName ()); if (! userService.checkIfValidOldPassword (user, oldPassword)) {throw new InvalidOldPasswordException (); } userService.changeUserPassword (používateľ, heslo); vrátiť nový GenericResponse (messages.getMessage ("message.updatePasswordSuc", null, locale)); }

Všimnite si, ako je metóda zabezpečená prostredníctvom @PreAuthorize anotáciu, pretože by mala prístupné iba pre prihlásených používateľov.

4. Testy API

Nakoniec skonzumujme API s niektorými testami API, aby sme sa ubezpečili, že všetko funguje dobre; začneme jednoduchou konfiguráciou testu a inicializáciou údajov:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (classes = {ConfigTest.class, PersistenceJPAConfig.class}, loader = AnnotationConfigContextLoader.class) verejná trieda ChangePasswordApiTest {private final String URL_PREFIX = "//host: private final String URL = URL_PREFIX + "/ user / updatePassword"; @Autowired private UserRepository userRepository; @Autowired private PasswordEncoder hesloEncoder; FormAuthConfig formConfig = nový FormAuthConfig (URL_PREFIX + "/ login", "používateľské meno", "heslo"); @Before public void init () {User user = userRepository.findByEmail ("[chránený e-mailom]"); if (user == null) {user = new User (); user.setFirstName ("Test"); user.setLastName ("Test"); user.setPassword (passwordEncoder.encode ("test")); user.setEmail ("[chránený e-mailom]"); user.setEnabled (true); userRepository.save (užívateľ); } else {user.setPassword (hesloEncoder.encode ("test")); userRepository.save (užívateľ); }}}

Teraz - skúsme to zmeniť heslo pre prihláseného používateľa:

@Test public void givenLoggedInUser_whenChangingPassword_thenCorrect () {RequestSpecification request = RestAssured.given (). Auth () .form ("[chránený e-mailom]", "test", formConfig); Parametre mapy = nový HashMap (); params.put ("oldpassword", "test"); params.put ("heslo", "najnovší"); Odozva odpoveď = request.with (). Params (params). Post (URL); assertEquals (200, response.statusCode ()); assertTrue (response.body (). asString (). contains ("Heslo bolo úspešne aktualizované")); }

Ďalej - skúsme zmeniť heslo dostal nesprávne staré heslo:

@Test public void givenWrongOldPassword_whenChangingPassword_thenBadRequest () {RequestSpecification request = RestAssured.given (). Auth () .form ("[email protected]", "test", formConfig); Parametre mapy = nový HashMap (); params.put ("oldpassword", "abc"); params.put ("heslo", "najnovší"); Odozva odpoveď = request.with (). Params (params). Post (URL); assertEquals (400, response.statusCode ()); assertTrue (response.body (). asString (). contains ("Neplatné staré heslo")); }

Na záver - skúsme zmeniť heslo bez autentifikácie:

@Test public void givenNotAuthenticatedUser_whenChangingPassword_thenRedirect () {Parametre mapy = nový HashMap (); params.put ("oldpassword", "abc"); params.put ("heslo", "xyz"); Odozva na odpoveď = RestAssured.with (). Params (params) .post (URL); assertEquals (302, response.statusCode ()); assertFalse (response.body (). asString (). contains ("Heslo bolo úspešne aktualizované")); }

Všimnite si, ako - pre každý test - poskytujeme a FormAuthConfig na spracovanie autentifikácie.

Obnovujeme tiež heslo pomocou init () aby sme sa pred testom ubezpečili, že používame správne heslo.

5. Záver

A to je zalomenie - priamy spôsob, ako umožniť používateľovi zmeniť svoje vlastné heslo po registrácii a prihlásení do aplikácie.

The úplná implementácia tohto tutoriálu nájdete v projekte github - toto je projekt založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.

« Predchádzajúca registrácia - sila hesla a pravidlá

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