I’ve implemented a EventListenerProvider to capture when users are created in my keycloak instance. I am using the public void onEvent(AdminEvent event, boolean includeRepresentation), but I am having issues getting the created user so I can send a welcome email. How should I go about this?
@Override
public void onEvent(AdminEvent event, boolean includeRepresentation) {
if (event.getResourceType() != ResourceType.USER || event.getOperationType() != OperationType.CREATE) {
return;
}
// ex: users/544d5da6-b682-4143-8234-86212cc1dbc4
String userId = event.getResourcePath().split("/")[1];
LOG.debugf("UserCreationEventListenerProvider - UserId: [%s]", userId);
RealmModel realm = session.realms().getRealm(event.getRealmId());
LOG.debugf("UserCreationEventListenerProvider - Realm: [%s]", realm.getName());
//UserModel user = session.users().getUserById(userId, realm); //java.lang.NoSuchMethodError: 'org.keycloak.models.UserModel org.keycloak.models.UserProvider.getUserById(java.lang.String, org.keycloak.models.RealmModel)'
//UserModel user = session.userStorageManager().getUserById(userId, realm); //java.lang.IllegalStateException: Access to the legacy store is no longer possible via this method. Adjust your code according to the Keycloak 19 Upgrading Guide.
UserModel user = //???
LOG.debugf("UserCreationEventListenerProvider - User: [%s]", user.getFirstName());
SendEmail(realm, user);
}
Seems that you compile your code with a (very) old version of the dependency and run it with a newer Keycloak server version. The method getUserById(userId, realm) is legacy, outdated and no more part of the most recent API. The actual method takes the arguments vice versa:
UserModel user = session.users().getUserById(realm, userId);
This should work.
Please test and return some feedback.
P.S.: Always use the same version of the dependencies in your extensions like your server will run!