#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, даже после сброса нового пароля.