Актуализиране на вашата парола

Тази статия е част от поредица: • Урок за пролетна регистрация на сигурността

• Процесът на регистрация с пролетна сигурност

• Регистрация - Активирайте нов акаунт по имейл

• Пролетна регистрация на сигурността - Изпратете отново имейл за потвърждение

• Регистрация с Spring Security - Кодиране на парола

• Регистрационният API става RESTful

• Spring Security - Нулирайте паролата си

• Регистрация - Сила и правила на паролата

• Актуализиране на вашата парола (текуща статия)

1. Общ преглед

В тази бърза статия ще внедрим проста функционалност „Промяна на собствената ми парола“, достъпна за потребителя, след като той се регистрира и влезе.

2. Клиентска страна - Промяна на страницата ми за парола

Нека да разгледаме много простата странична страница на клиента:

 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. Актуализирайте потребителската парола

Нека сега приложим и операцията от страна на сървъра:

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

Забележете как методът е защитен чрез анотацията @PreAuthorize , тъй като трябва да е достъпен само за влезли потребители .

4. API тестове

И накрая, нека консумираме API с някои API тестове, за да сме сигурни, че всичко работи добре; ще започнем с простата конфигурация на теста и инициализацията на данните:

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

Сега - нека се опитаме да сменим паролата за влязъл потребител :

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

След това - нека се опитаме да сменим паролата при грешна стара парола :

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

И накрая - нека се опитаме да сменим паролата без удостоверяване :

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

Забележете как - за всеки тест - ние предоставяме FormAuthConfig за обработка на удостоверяването.

Ние също така нулираме паролата чрез init (), за да сме сигурни, че използваме правилната парола преди теста.

5. Заключение

И това е приключване - ясен начин да позволите на потребителя да промени собствената си парола след регистрация и влизане в приложението.

Най- пълното прилагане на този урок може да се намери в проекта GitHub - това е Eclipse проект на базата, така че трябва да бъде лесен за внос и работи като такъв.

« Предишна регистрация - Сила и правила на паролата