keycloak: проверьте, совпадает ли старый пароль, если да, измените на другой

#java #keycloak

#java #keycloak

Вопрос:

Java с зависимостью maven «keycloak-admin-cli»

У меня есть этот код:

   keycloakService.findUserByEmailOrUsername( user.getKeycloakUsername() )
                    .ifPresent( userRepresentation -> {
                        //Check for old password
                        if ( userRepresentation.getCredentials() != null ) {
                            for (CredentialRepresentation c : userRepresentation.getCredentials()) {
                                if ( CredentialRepresentation.PASSWORD.equals( c.getType() ) ) {
                                    if ( userDTO.getOldpassword().equals( c.getValue() ) ) {
                                        //Das alte Passwort stimmt mit dem in der Datenbank überein. Wir können updaten
                                        //Neues Passwort setzen
                                        CredentialRepresentation credential = new CredentialRepresentation();
                                        credential.setType( CredentialRepresentation.PASSWORD );
                                        credential.setValue( userDTO.getPassword() );
                                        credential.setTemporary( false );
                                        userRepresentation.setCredentials( Collections.singletonList( credential ) );
                                    } else {
                                        throw new RuntimeException( "Your current password does not match", null );
                                    }
                                }
                            }
                        }
                    } );
  

Я проверил с помощью отладчика и получил правильного пользователя. «Представление пользователя» не равно нулю.
Но учетные данные пользователя всегда равны нулю.

Также, если я только хочу установить новый пароль для пользователя, он не обновляется:

                 keycloakService.findUserByEmailOrUsername( user.getKeycloakUsername() )
                    .ifPresent( userRepresentation -> {
                        CredentialRepresentation credential = new CredentialRepresentation();
                        credential.setType( CredentialRepresentation.PASSWORD );
                        credential.setValue( userDTO.getPassword() );
                        credential.setTemporary( false );
                        userRepresentation.setCredentials( Collections.singletonList( credential ) );
                    } );
  

Я не получаю сообщение об ошибке, keycloak просто не обновляется.

Может кто-нибудь показать мне пример, как я могу проверить старый пароль и изменить его на другой? спасибо

Комментарии:

1. Вы хотите, чтобы пользователь при установке своего пароля, который проверяет keycloak, проверял, является ли он уже старым паролем, который он / она использовал?

2. @dreamcrash Нет. Прежде чем пользователь сможет изменить свой пароль, я бы хотел, чтобы он снова подтвердил свой текущий пароль.

3. Я немного смущен, но разве это не функция, которая уже предоставляется keycloak из коробки?

4. да, если вы используете графический интерфейс из keycloak. Я использую репозиторий maven «keycloak-admin-ci», чтобы сделать это программно

5. @Paul вы смогли решить эту проблему? Мне также нужно проверить старый пароль пользователя, чтобы установить новый.

Ответ №1:

Попробуйте использовать UserResource вместо userpresentation .

userResource.get(userId).credentials() вместо userRepresentation.getCredentials() должно работать, но это больше похоже на обходной путь.

Начиная с 26.07.2021, getCredentials всегда возвращает null .

Комментарии:

1. userRepresentation.GetGroups и userRepresentation.getRoles также возвращают значение null, поэтому необходимо некоторое разъяснение toRepresentation() в документе Keycloak.

2. смогли ли вы решить эту проблему? Мне также нужно проверить старый пароль пользователя, чтобы установить новый.

3. К сожалению, нет. Но с нетерпением жду keycloak 20. В этом пункте также должно быть много улучшений

Ответ №2:

Для обновления пароля используйте :

 userRessource.get(userId).resetPassword(credential);
  

смотрите этот пример: https://gist.github.com/thomasdarimont/0c136d0b8d339b997928e9bef225f941

Но для проверки фактических учетных данных мне не удалось проверить, есть ли он, как вы говорите, userRepresentation.getCredentials() всегда имеет значение null, даже после сброса нового пароля.