Мы используем базовую встроенную функциональность Spring для регистрации пользователей следующим образом:
.and()
.formLogin()
.loginPage("/#/login")
.loginProcessingUrl("/authenticate")
.successHandler(loginAuthenticationSuccessHandler)
.failureHandler(loginAuthenticationFailureHandler)
Это сработало хорошо, но мы только добавили возможность смены пароля с помощью
String userName = request.getUserPrincipal().getName();
User loggedInUser = userService.getUserByUserName(userName);
if (loggedInUser == null){
throw new NotFoundException(String.format("Invalid ChangePassword [LoggedIn] Request, User: %s not found....", userName));
}
if (bCryptPasswordEncoder.matches(passwordDto.getOld_password(), userService.getPassword(loggedInUser.getUser_id()))) {
userService.changePassword(loggedInUser.getUser_id(), bCryptPasswordEncoder.encode(passwordDto.getNew_password()));
request.getSession().invalidate();
List<Object> principals = sessionRegistry.getAllPrincipals();
for(Object principal : principals) {
org.springframework.security.core.userdetails.User user = (org.springframework.security.core.userdetails.User) principal;
List<SessionInformation> principalSessionInfos = sessionRegistry.getAllSessions(principal, false);
if(user.getUsername().equals(userName)) {
for(SessionInformation sessionInfo : principalSessionInfos) {
sessionInfo.expireNow();
}
}
}
Мывначале этого не было, но, как вы видите, мы добавили так, что мы прекращаем сеансы и аннулируем запрашивающий сеанс при смене пароля.Это было добавлено в попытке решить возникшую проблему: если мы снова войдем в систему после смены пароля, мы получим файл cookie, похожий на:
JSESSIONID=1520468DA128EFD92162018AE56573FC
Path=/
HttpOnlyremember-me-cookie=c3dldGVzdGVyMTlAZ21haWwuY29tOjE2MDA5NDQyMDYzOTg6MzRhZmJkM2ZjNjc3NTUwOWRlMDk2MGEwYjg4ZTE4NjI
Max-Age=31536000
Path=/
HttpOnly=
, где вы можете видеть, что HttpOnlyremember-me-cookie=
вместестрока.Так что HttpOnly
по какой-то причине попал в эту часть куки.Это отправляется клиенту, и когда клиент использует cookie, Spring не имеет проблем с аутентификацией пользователя, но, поскольку мы действительно заботимся о файле cookie, запоминаемом в нашем приложении, у нас возникают проблемы с его анализом.
Кто-нибудь знаетпочему это могло произойти и что мы могли сделать?Мы хотим сделать все сеансы недействительными при смене пароля, чтобы все клиенты этой учетной записи должны были снова войти в систему.И мы хотим, чтобы печенье не выглядело испорченным!