Автор оригинала: 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);
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, поэтому его должно быть легко импортировать и запускать как есть.