Keycloak - установщики UserModelDelegate не вызываются

Я работаю с Keycloak v4.8.3.

В настоящее время я пытаюсь реализовать UserStorageProvider со стратегией импорта. Я следую документации:

https://www.keycloak.org/docs/4.8/server_development/index.html#import-implementation-strategy

Это мой метод createAdapter:

   protected UserModel createAdapter(RealmModel realm, String username) {
    UserModel local = session.userLocalStorage().getUserByUsername(username, realm);
    if (local == null) {
        local = session.userLocalStorage().addUser(realm, username);
        local.setFederationLink(model.getId());
        local.setEnabled(true);
        local.setFirstName("test");
        local.setLastName("test");
    }
    return new UserModelDelegate(local) {
        @Override
        public void setUsername(String username) {
            System.out.println(username);
            super.setUsername(username);
        }
        @Override
        public void setEmail(String email) {
            System.out.println(email);
            super.setEmail(email);
        }
    };
}

При входе в систему пользовательский адаптер создается и импортируется во внутреннюю базу данных keycloak. Когда я пытаюсь изменить адрес электронной почты на странице учетной записи, метод setEmail () никогда не вызывается. Keycloak просто обновляет внутреннюю базу данных.

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


person tobiso    schedule 04.09.2019    source источник
comment
Может быть, вы можете попробовать Keycloak Event Listener SPI. И там вы можете прослушивать события создания, обновления и удаления пользователей (что также предоставит вам представление пользователя). И сделайте там необходимые обновления.   -  person Achu    schedule 05.09.2019
comment
У меня такая же проблема, удалось ли ее решить?   -  person monzonj    schedule 01.03.2020
comment
Смотрите мой ответ. Пожалуйста, попробуйте и сообщите, работает ли он для вас   -  person tobiso    schedule 03.03.2020


Ответы (1)


В итоге мы не реализовали его в то время, но когда @monzonj попросил об этом, я снова исследовал проблему. Ключ, похоже, заключается в реализации интерфейса ImportedUserValidation

public class CustomUserProvider implements ImportedUserValidation {
    /*ImportedUserValidation*/
    @Override
    public UserModel validate(RealmModel realm, UserModel user) {
        return new CustomUser(user);
    }
}


public class CustomUser extends UserModelDelegate { 
    public CustomUser(UserModel delegate) {
        super(delegate);
    }

    @Override
    public void setFirstName(String firstName) {
        super.setFirstName(firstName);
        // Put your code here...
    }
}

Я не уверен, что это правильный способ сделать это, но быстрый тест показал, что это вызовет установщик, когда вы попытаетесь изменить свое имя на странице управления учетной записью.

РЕДАКТИРОВАТЬ: теперь мы используем keycloak v8.0.2

person tobiso    schedule 03.03.2020
comment
Эй, это работает. Спасибо! Я не знаю, правильный ли это способ (все равно кажется, что это ошибка), но у меня он работает. Я использую последнюю версию Keycloak 9.0.0 - person monzonj; 08.03.2020