Я создал 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, в имени пользователя сохраняется только имя пользователя. база данных (не адрес электронной почты, имя и т. д. c.):
![enter image description here](https://i.stack.imgur.com/ZL7hWl.png)
Как видите, операция 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)
следует за этой логикой c:
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
) остальными полями
Однако я не вижу, как сделать заполненный пользовательский объект постоянным.