Refactor events to use event store instead of syslog (#36684)

Closes #35091

Signed-off-by: stianst <stianst@gmail.com>
This commit is contained in:
Stian Thorgersen
2025-01-23 07:40:49 +01:00
committed by GitHub
parent 5387aef0fa
commit ec2c701a80
11 changed files with 333 additions and 130 deletions

View File

@@ -4,6 +4,7 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.events.admin.OperationType;
import org.keycloak.representations.idm.AdminEventRepresentation;
import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.representations.idm.UserRepresentation;
import org.keycloak.testframework.annotations.InjectAdminClient;
@@ -13,21 +14,28 @@ import org.keycloak.testframework.annotations.KeycloakIntegrationTest;
import org.keycloak.testframework.events.AdminEvents;
import org.keycloak.testframework.realm.ManagedRealm;
import java.util.List;
@KeycloakIntegrationTest
public class AdminEventsTest {
@InjectAdminEvents
private AdminEvents adminEvents;
@InjectAdminClient
private Keycloak adminClient;
@InjectRealm
private ManagedRealm realm;
@InjectAdminEvents
private AdminEvents adminEvents;
@InjectRealm(ref = "master", attachTo = "master")
private ManagedRealm master;
@InjectAdminEvents(ref = "master", realmRef = "master")
private AdminEvents masterAdminEvents;
@InjectAdminClient
private Keycloak adminClient;
@Test
public void testAdminEventOnUserCreateAndDelete() {
String userName = "create_user";
UserRepresentation userRep = new UserRepresentation();
@@ -47,21 +55,23 @@ public class AdminEventsTest {
@Test
public void testAdminEventOnRealmCreateAndUpdate() {
master.updateWithCleanup(r -> r.adminEventsEnabled(true));
String realmName = "create_realm";
RealmRepresentation realmRep = new RealmRepresentation();
realmRep.setRealm(realmName);
realmRep.setEnabled(true);
realmRep.setAdminEventsEnabled(true);
adminClient.realms().create(realmRep);
Assertions.assertEquals(OperationType.CREATE, adminEvents.poll().getOperationType());
Assertions.assertEquals(OperationType.CREATE, masterAdminEvents.poll().getOperationType());
}
RealmRepresentation realmRep2 = adminClient.realms().realm(realmName).toRepresentation();
realmRep2.setEnabled(false);
adminClient.realms().realm(realmName).update(realmRep2);
@Test
public void testAdminEventOnRealmUpdate() {
realm.updateWithCleanup(r -> r.editUsernameAllowed(true));
Assertions.assertEquals(OperationType.UPDATE, adminEvents.poll().getOperationType());
}

View File

@@ -3,43 +3,57 @@ package org.keycloak.test.examples;
import com.nimbusds.oauth2.sdk.GeneralException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.keycloak.events.Event;
import org.keycloak.events.EventType;
import org.keycloak.testframework.annotations.InjectEvents;
import org.keycloak.testframework.annotations.InjectRealm;
import org.keycloak.testframework.annotations.KeycloakIntegrationTest;
import org.keycloak.testframework.events.Events;
import org.keycloak.testframework.oauth.nimbus.OAuthClient;
import org.keycloak.testframework.oauth.nimbus.annotations.InjectOAuthClient;
import org.keycloak.testframework.ui.annotations.InjectPage;
import org.keycloak.testframework.ui.annotations.InjectWebDriver;
import org.keycloak.testframework.ui.page.LoginPage;
import org.openqa.selenium.WebDriver;
import org.keycloak.testframework.realm.ManagedRealm;
import org.keycloak.testframework.remote.timeoffset.InjectTimeOffSet;
import org.keycloak.testframework.remote.timeoffset.TimeOffSet;
import java.io.IOException;
import java.net.URL;
@KeycloakIntegrationTest
public class EventsTest {
@InjectRealm
private ManagedRealm realm;
@InjectEvents
private Events events;
@InjectOAuthClient
private OAuthClient oAuthClient;
@InjectWebDriver
private WebDriver webDriver;
@InjectPage
private LoginPage loginPage;
@InjectTimeOffSet
TimeOffSet timeOffSet;
@Test
public void testFailedLogin() throws GeneralException, IOException {
URL authorizationRequestURL = oAuthClient.authorizationRequest();
webDriver.navigate().to(authorizationRequestURL);
loginPage.fillLogin("invalid", "invalid");
loginPage.submit();
public void testFailedLogin() {
oAuthClient.resourceOwnerCredentialGrant("invalid", "invalid");
Assertions.assertEquals(EventType.LOGIN_ERROR, events.poll().getType());
Event event = events.poll();
Assertions.assertEquals(EventType.LOGIN_ERROR, event.getType());
Assertions.assertEquals("invalid", event.getDetails().get("username"));
oAuthClient.resourceOwnerCredentialGrant("invalid2", "invalid");
event = events.poll();
Assertions.assertEquals(EventType.LOGIN_ERROR, event.getType());
Assertions.assertEquals("invalid2", event.getDetails().get("username"));
}
@Test
public void testTimeOffset() throws GeneralException, IOException {
timeOffSet.set(60);
oAuthClient.clientCredentialGrant();
Assertions.assertEquals(EventType.CLIENT_LOGIN, events.poll().getType());
}
@Test