我已经实现了自定义事件监听器提供程序。
我可以接收除领域创建事件(新领域创建)以外的所有事件。我也想在领域创建过程中得到这个事件。
Keycloak支持吗?如果没有,实现这一目标的任何其他可能性?
我正在使用Keycloak 4.5.0版。
谢谢。
答案 0 :(得分:2)
对keycloak代码进行了一些研究之后,我得出的结论是keycloak默认情况下不提供该事件。
因此,我修改了以下来自keycloak的文件,这将有助于捕获Realm创建和删除事件。
更改1(最重要):
文件:
keycloak / services / src / main / java / org / keycloak / services / managers / RealmManager.java
功能:
受保护的void setupRealmDefaults
在以上功能中,您应该在领域创建过程中将事件侦听器添加到领域。
Set<String> eventListenerSet = new HashSet<>();
eventListenerSet.add("jboss-logging"); //This listener will be there by default
eventListenerSet.add("EVENT_LISTENER_YOU_WANT_TO_RECEIVE_EVENT");
realm.setEventsListeners(eventListenerSet);
更改2:
文件:
keycloak / services / src / main / java / org / keycloak / services / resources / admin / RealmsAdminResource.java
功能:
公共响应importRealm
在上面的函数中,在返回响应之前添加以下行
Line 1: Create object for admin event
Line 2: Prepare event to trigger with appropriate event type and representation, in this case Create
AdminEventBuilder adminEvent = new AdminEventBuilder(realm, auth, session, clientConnection);
adminEvent.operation(OperationType.CREATE).resource(ResourceType.REALM).representation(StripSecretsUtils.strip(rep)).success();
更改3(仅在需要删除事件时才需要)
文件:
keycloak / services / src / main / java / org / keycloak / services / resources / admin / RealmAdminResource.java
功能:
public void deleteRealm
在第一行之后添加以下代码
AdminAuth adminAuth = auth.adminAuth();
RealmRepresentation realmRepresentation = new RealmRepresentation();
realmRepresentation.setRealm(realm.getName());
AdminEventBuilder adminEvent = new AdminEventBuilder(realm, adminAuth, session, connection);
adminEvent.operation(OperationType.DELETE).resource(ResourceType.REALM).representation(realmRepresentation).success();