如何使用 AdminEvent 获取在 keycloak 中删除的用户的详细信息

Log*_*onJ 5 java spring redhat keycloak keycloak-services

当管理员在 keycloak UI 中创建或删除用户时,我有以下代码会被执行。通过 adminEvent 的帮助:http ://www.keycloak.org/docs/3.0/server_admin/topics/events/admin.html 创建用户通过 adminEvent.getRepresentation() 返回用户详细信息。但是,当删除用户时返回一个空值。

这在删除角色、删除组或删除 user_session 时也是一样的。 (ResourceTypes)

我的问题是如何检索已删除的详细信息?

import org.keycloak.events.admin.AdminEvent;
import org.keycloak.models.UserModel;

public void handleResourceOperation(AdminEvent adminEvent, UserModel user) {

        MQMessage queueMessage = new MQMessage();
        queueMessage.setIpAddress(adminEvent.getAuthDetails().getIpAddress());
        queueMessage.setUsername(user.getUsername());

        switch (adminEvent.getOperationType()) {
        case CREATE:
            LOGGER.info("OPERATION : CREATE USER");
            LOGGER.info("USER Representation : " + adminEvent.getRepresentation());
            String[] split = adminEvent.getRepresentation().split(",");
            queueMessage.setTransactionDetail("Created user " + split[0].substring(12));
            sendQueueMessage(adminEvent, queueMessage);
            break;
        case DELETE:
            LOGGER.info("OPERATION : DELETE USER");
            LOGGER.info("USER Representation : " + adminEvent.getRepresentation());
            queueMessage.setTransactionDetail("User has been deleted.");
            sendQueueMessage(adminEvent, queueMessage);
            break;
}
Run Code Online (Sandbox Code Playgroud)

Sel*_*amy 2

我不确定你现在已经得到答案了。分享可能对其他人有帮助的解决方案。可以在 EventListenerProviderFactory 的方法中捕获用户详细信息,postInit如下所示,

public class UserEventListenerProviderFactory implements EventListenerProviderFactory {

@Override
public EventListenerProvider create(KeycloakSession keycloakSession) {
    return new UserEventListenerProvider(keycloakSession);
}

@Override
public void init(Config.Scope scope) {
}

@Override
public void postInit(KeycloakSessionFactory keycloakSessionFactory) {
    
    keycloakSessionFactory.register(
            (event) -> {
                if (event instanceof UserModel.UserRemovedEvent) {
                    UserModel.UserRemovedEvent dEvent = (UserModel.UserRemovedEvent) event;
                    //TODO YOUR LOGIC WITH `dEvent.getUser()`
                }
            });
}

@Override
public void close() {

}

@Override
public String getId() {
    return "sample_event_listener";
}
Run Code Online (Sandbox Code Playgroud)

}