Автор оригинала: Eugen Paraschiv.
1. Обзор
В этой краткой статье мы реализуем простую функцию “Изменить свой собственный пароль”, доступную пользователю после регистрации и входа в систему.
2. Клиентская Сторона – Страница Изменения Пароля
Давайте взглянем на очень простую страницу на стороне клиента:
Password mismatch
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 = "http://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); Mapparams = 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); Mapparams = 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() { Mapparams = 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, поэтому его должно быть легко импортировать и запускать как есть.