我有一个Keycloak扩展名(自定义端点,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();
}
我知道必须在Keycloak管理控制台中激活管理员事件日志记录。
也许与登录用户没有管理特权有关,但是当我授予管理员特权时,它也无效。
对于这里我做错的事情,我需要想法或提示。不幸的是,文档和网络研究无济于事。
答案 0 :(得分:1)
看看Keycloak的源代码,尤其是RootAdminResource之类的东西。据我所记得,所有管理资源(例如控制器)都是通过从生成器克隆的生成器创建事件的,而生成器是由父资源通过构造器注入的。您可能会缺少一些初始化技巧。
答案 1 :(得分:0)
好的,我们发现了。
首先,对于update
/ delete
,我们必须将领域添加到adminEvent
中。
其次,对于创建,我们在
event
日志记录
session.getTransactionManager().commit();
到位。在adminEvent.success()
解决问题后设置提交。
也许这可以帮助任何人。