Как зарегистрировать пользователя в моей собственной базе данных через keycloak - PullRequest
0 голосов
/ 23 апреля 2020

Я использую Keycloak в течение очень короткого времени. сделал keycloak использовать мою собственную базу данных пользователей, и она отлично работает. Я хотел бы, чтобы новые пользователи, которые регистрируются, были зарегистрированы непосредственно в моей базе данных. Поэтому я реализовал класс UseRegistrationProvider, который содержит методы addUser(RealmModel realm, String username) и removeUser(RealmModel realm, UserModel user). Проблема в том, что в методе addUser у меня есть только имя пользователя, и я хотел бы, чтобы все поля были заполнены в регистрационной форме. Как мне это сделать?

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Вот мой код. Что я пропустил?

public class MyUserStorageProvider implements UserStorageProvider,
UserRegistrationProvider,
UserLookupProvider, 
UserQueryProvider, 
CredentialInputUpdater, 
CredentialInputValidator {

    private final KeycloakSession session;
    private final ComponentModel model;
    private final UserRepository repository;

    public MyUserStorageProvider(KeycloakSession session, ComponentModel model, UserRepository repository) {
        this.session = session;
        this.model = model;
        this.repository = repository;
    }

    ...

    @Override
    public UserModel addUser(RealmModel realm, String username) {
        User user = new User();
        user.setUsername(username);
        user.setEmail("I don't have email in addUser method");
        if(repository.addUser(user))
            return new UserAdapter(session, realm, model, user);
        else return null;
    }
}



public class UserAdapter extends AbstractUserAdapterFederatedStorage {

    private final User user;
    private final String keycloakId;

    public UserAdapter(KeycloakSession session, RealmModel realm, ComponentModel model, User user) {
        super(session, realm, model);
        this.user = user;
        this.keycloakId = StorageId.keycloakId(model, user.getId());
    }

    @Override
    public String getId() {
        return keycloakId;
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public void setUsername(String username) {
        user.setUsername(username);
    }

    @Override
    public String getEmail() {
        return user.getEmail();
    }

    @Override
    public void setEmail(String email) {
        user.setEmail(email);
    }

    @Override
    public String getFirstName() {
        return user.getFirstName();
    }

    @Override
    public void setFirstName(String firstName) {
        user.setFirstName(firstName);
    }

    @Override
    public String getLastName() {
        return user.getLastName();
    }

    @Override
    public void setLastName(String lastName) {
        user.setLastName(lastName);
    }
}


class UserRepository {

    private EntityManager em;

    public UserRepository(MultivaluedHashMap<String, String> config) {
        em = new JpaEntityManagerFactory(new Class[]{User.class}, config).getEntityManager();
    }
...

    boolean addUser(User user) {
        try {
            em.getTransaction().begin();
            em.persist(user);
            em.getTransaction().commit();
            return true;
        }catch(Exception e) { 
            return false; 
        }
    }
}
0 голосов
/ 24 апреля 2020

метод addUser (...) возвращает объект, реализующий UserModel. Вам нужно будет реализовать адаптер UserModel, позволяющий установить нужные атрибуты.

См. Пример быстрого запуска

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...