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

1. Обзор

В этой быстрой статье мы реализуем простую функциональность «Изменить свой пароль», доступную пользователю после регистрации и входа в систему.

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

Давайте посмотрим на очень простую страницу клиента:

<html>
<body>
<div id="errormsg" style="display:none"></div>
<div>
    <input id="oldpass" name="oldpassword" type="password"/>
    <input id="pass" name="password" type="password"/>
    <input id="passConfirm" type="password"/>
    <span id="error" style="display:none">Password mismatch</span>

   <button type="submit" onclick="savePass()">Change Password</button>
</div>

<script src="jquery.min.js"></script>
<script type="text/javascript">

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);
    });
}
</script>
</body>
</html>

3. Обновить пароль пользователя

Давайте теперь также реализуем серверную операцию:

@RequestMapping(value = "/user/updatePassword", method = RequestMethod.POST)
@PreAuthorize("hasRole('READ__PRIVILEGE')")
@ResponseBody
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<String, String> params = new HashMap<String, String>();
    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<String, String> params = new HashMap<String, String>();
    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<String, String> params = new HashMap<String, String>();
    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. Заключение

И это обертка - простой способ позволить пользователю изменить свой пароль после регистрации и входа в приложение.

  • Полная реализация ** этого учебника может быть найдена в the github project - это проект на основе Eclipse, поэтому его легко импортировать и запускать как это.

  • «** Предыдущая