Spring Security помнит, что cookie-файл недействителен после смены пароля - PullRequest
0 голосов
/ 25 сентября 2019

Мы используем базовую встроенную функциональность 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, запоминаемом в нашем приложении, у нас возникают проблемы с его анализом.

Кто-нибудь знаетпочему это могло произойти и что мы могли сделать?Мы хотим сделать все сеансы недействительными при смене пароля, чтобы все клиенты этой учетной записи должны были снова войти в систему.И мы хотим, чтобы печенье не выглядело испорченным!

...