Aktualizácia hesla
• 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á