Пользователи, созданные из консоли администратора, сохраняют имя пользователя только при использовании SPI поставщика хранилища.

Я создал MongoDbUserStorageProvider чтобы делегировать пользовательское хранилище в MongoDB:

public class MongoDbUserStorageProvider implements
        UserStorageProvider,
        UserLookupProvider,
        CredentialInputValidator,
        CredentialInputUpdater,
        UserQueryProvider,
        UserRegistrationProvider {
        ...
}

public final class MongoUserAdapter extends AbstractUserAdapter {

        ...
    @Override
    public void setFirstName(String firstName) {
        this.userDocument.put("firstName", firstName);
    }
        ...
}

У меня есть проблема: когда я создаю пользователя через консоль Keycloak, в базе данных сохраняется только имя пользователя (а не адрес электронной почты, имя и т. Д.):

Как видите, UserRegistrationProvider.addUser(RealmModel realm, String username) операция получает только имя пользователя:

    @Override
    public UserModel addUser(RealmModel realm, String username) {
        final MongoCollection<Document> users = database.getCollection("users");
        Document doc = new Document("username", username);
        users.insertOne(doc);
        Optional<Document> insertedUser = loadUserDocument(new HashMap<String, String>() {{
            put("username", username);
        }});
        return buildUserModel(realm, insertedUser.get());
    }

В org.keycloak.services.resources.admin.UsersResource метод public Response createUser(final UserRepresentation rep) следует этой логике:

        try {
            UserModel user = session.users().addUser(realm, rep.getUsername()); //1)
            Set<String> emptySet = Collections.emptySet();

            UserResource.updateUserFromRep(user, rep, emptySet, realm, session, false); //2)
            RepresentationToModel.createCredentials(rep, session, realm, user, true);
            adminEvent.operation(OperationType.CREATE).resourcePath(session.getContext().getUri(), user.getId()).representation(rep).success();

            if (session.getTransactionManager().isActive()) {
                session.getTransactionManager().commit();
            }

            return Response.created(session.getContext().getUri().getAbsolutePathBuilder().path(user.getId()).build()).build();
        } catch (ModelDuplicateException e) {
            if (session.getTransactionManager().isActive()) {
                session.getTransactionManager().setRollbackOnly();
            }
            return ErrorResponse.exists("User exists with same username or email");
        } catch (ModelException me){
            if (session.getTransactionManager().isActive()) {
                session.getTransactionManager().setRollbackOnly();
            }
            logger.warn("Could not create user", me);
            return ErrorResponse.exists("Could not create user");
        }
    }

1) Он вызывает мою реализацию addUser (сохранение нового пользователя только с именем пользователя)

2) Он заполняет объект пользователя (MongoUserAdapter) с остальными полями

Однако я не вижу, как сохранить заполненный пользовательский объект.

0 ответов

Другие вопросы по тегам