Рубрики
Без рубрики

Обновление пароля

Как разрешить пользователю обновлять/изменять свой собственный пароль после входа в приложение.

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