Java KeyClope:从自定义端点(SPI)发送AdminEvent

Java KeyClope:从自定义端点(SPI)发送AdminEvent,java,keycloak,Java,Keycloak,我有一个keydape扩展(自定义端点,SPI)。现在,我想添加发送AdminEvents,我实现如下: private void logAdminEvent(ClientConnection clientConnection, UserRepresentation rep, OperationType operation, ResourceType resource) { RealmModel realm = session.getContext().getRealm();

我有一个
keydape
扩展(自定义端点,SPI)。现在,我想添加发送
AdminEvents
,我实现如下:

    private void logAdminEvent(ClientConnection clientConnection, UserRepresentation rep, OperationType operation, ResourceType resource) {
    RealmModel realm = session.getContext().getRealm();
    // beware: clientConnection must not be null because of missing check for NullPointer in Keycloak
    ClientModel client = realm.getClientByClientId(ROLE_ATTRIBUTE_CLIENT);
    AdminAuth adminAuth = new AdminAuth(realm, authResult.getToken(), authResult.getUser(), client);
    AdminEventBuilder adminEvent = new AdminEventBuilder(realm, adminAuth, session, clientConnection);
    adminEvent
            .operation(operation)
            .resource(resource)
            .authIpAddress(authResult.getSession().getIpAddress())
            .authClient(client)
            .resourcePath(session.getContext().getUri())
            .representation(rep);

    adminEvent
            .success();
}
我知道管理员
事件
日志必须在keydovate管理控制台中激活,我就是这么做的

也许登录的用户没有管理权限是相关的,但当我授予管理员权限时,它也不起作用


我需要一些想法或提示来说明我在这里做错了什么。不幸的是,文档和web研究没有起到任何作用。

请查看keydape源代码,特别是类似于
RootAdminResource
。据我所知,所有管理资源(例如
控制器
)都通过
builder
创建
事件
,该事件是从父资源通过构造函数注入的
builder
克隆而来的。您可能缺少一些初始化技巧。

好的,我们发现了。 首先,对于
update
/
delete
,我们必须将领域添加到
adminEvent
。 其次,对于create,我们在

session.getTransactionManager().commit();
发生了。在
adminEvent.success()之后设置commit修复了该问题


也许这可以帮助任何人。

谢谢。我确实看了一眼,就像你记得的那样。到现在为止,我还没有找到失败点。好吧,我们找到了。首先,对于更新/删除,我们必须将领域添加到adminEvent。其次,对于create,我们在session.getTransactionManager().commit()之后记录了事件;发生了。在adminEvent.success()之后设置commit修复了该问题。