Trying to determine the best/most correct way to have keycloak send user org/membership events.
From the docs it seems that the way to go is to implement EventListenerProviderFactory and EventListenerProvider .
But then I’m required to fish out the details I want (userId, orgId, group) from a combination of path and details (parse JSON). Which I found error prone and made me wonder if it’s the intended way.
Then I found that I can implement ProviderEventListener and check for strongly typed events (such as OrganizationModel.OrganizationMemberLeaveEvent). Which I found to be less error prone.
What’s the difference between ProviderEventListener and EventListenerProvider?
public class EventLogger implements EventListenerProvider, ProviderEventListener {
//( omitted for brevity ...)
@Override
public void onEvent(ProviderEvent event) {
if (event instanceof OrganizationModel.OrganizationMemberLeaveEvent leaveEvent) {
log.infof("user id: %s", leaveEvent.getUser().getId());
log.infof("org id: %s", leaveEvent.getOrganization().getId());
}
}
@Override
public void onEvent(AdminEvent event, boolean includeRepresentation) {
if(
event.getResourceType() == ResourceType.ORGANIZATION_MEMBERSHIP &&
event.getOperationType() == OperationType.DELETE)
{
log.info(event.getRepresentation());
log.info(event.getDetails());
log.info(event.getResourcePath());
}
}
}