Keycloak-事件侦听器提供程序未触发新领域创建事件

时间:2019-02-19 12:42:23

标签: keycloak keycloak-services

我已经实现了自定义事件监听器提供程序。

我可以接收除领域创建事件(新领域创建)以外的所有事件。我也想在领域创建过程中得到这个事件。

Keycloak支持吗?如果没有,实现这一目标的任何其他可能性?

我正在使用Keycloak 4.5.0版。

谢谢。

1 个答案:

答案 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();