From 61a7889c9299ac5c9619dd66d754e9f5a2008cf9 Mon Sep 17 00:00:00 2001 From: cgeorgilakis-grnet Date: Mon, 23 Sep 2024 13:26:18 +0300 Subject: [PATCH] Configured value for voPersonId --- CHANGELOG.md | 5 +++++ README.md | 1 + pom.xml | 2 +- .../keycloak/metrics/representations/MetricsDto.java | 10 +++++++--- .../org/keycloak/metrics/utils/AmsCommunication.java | 2 +- .../java/org/keycloak/metrics/utils/MetricsUtils.java | 3 ++- 6 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d60203..3c0f236 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 For Keycloak upstream changelog please see https://www.keycloak.org/docs/latest/release_notes/index.html. Full Keycloak upstream jira issue can be shown if filtered by Fix version. For example [Keycloak jira issue for 15.0.2 version](https://issues.redhat.com/browse/KEYCLOAK-19161?jql=project%20%3D%20keycloak%20and%20fixVersion%20%3D%2015.0.2) +## [2.1.0] - 23-09-2024 + +### Changed +- Configured value for voPersonId + ## [2.1.0] - 10-7-2024 ### Added - Add idpName together with authnAuthority diff --git a/README.md b/README.md index 79a8da4..a429074 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ You need to define the following realm attributes in order Keycloak metric plugi - tenenvId : environment parameter - source : Keycloak - keycloakUrl : Keycloak main url +- metricsUserIdAttribute : key of event details that value will be set to voPersonId, default to username Moreover, you need to add in Events Config -> Event Listeners the "metrics-communication". diff --git a/pom.xml b/pom.xml index d02f72d..2e1e507 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 4.12.0 17 17 - 2.1.0 + 2.2.0 diff --git a/src/main/java/org/keycloak/metrics/representations/MetricsDto.java b/src/main/java/org/keycloak/metrics/representations/MetricsDto.java index fe58906..4293c38 100644 --- a/src/main/java/org/keycloak/metrics/representations/MetricsDto.java +++ b/src/main/java/org/keycloak/metrics/representations/MetricsDto.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import org.keycloak.events.Details; import org.keycloak.events.Event; import org.keycloak.metrics.utils.MetricsUtils; import org.keycloak.models.ClientModel; @@ -46,7 +47,7 @@ public MetricsDto() { } - public MetricsDto(Event event, RealmModel realm) throws IOException { + public MetricsDto(Event event, RealmModel realm) throws Exception { this.date = LocalDateTime.ofInstant(Instant.ofEpochMilli(event.getTime()), ZoneId.systemDefault()); this.tenenvId = realm.getAttribute(MetricsUtils.TENENV_ID); this.source = realm.getAttribute(MetricsUtils.SOURCE); @@ -82,11 +83,14 @@ public MetricsDto(Event event, RealmModel realm) throws IOException { } } - private void setLogin(Event event, RealmModel realm) throws IOException { + private void setLogin(Event event, RealmModel realm) throws Exception { this.ipAddress = event.getIpAddress(); if (event.getDetails() == null) event.setDetails(new HashMap<>()); - this.voPersonId = event.getDetails().get(MetricsUtils.VO_PERSON_ID); + String userIdentifier = realm.getAttribute(MetricsUtils.METRICS_USER_ID_ATTRIBUTE); + this.voPersonId = event.getDetails().get(userIdentifier != null ? userIdentifier : Details.USERNAME); + if ( this.voPersonId == null) + throw new Exception(userIdentifier + " as userIdentifier does not exist in"); if (event.getDetails().get(MetricsUtils.IDENTITY_PROVIDER_AUTHN_AUTHORITIES) != null) { AuthnAuthorityRepresentation lastAuthnAuthority = JsonSerialization.readValue(event.getDetails().get(MetricsUtils.IDENTITY_PROVIDER_AUTHN_AUTHORITIES),new TypeReference>(){}).getLast(); this.entityId = lastAuthnAuthority.getId(); diff --git a/src/main/java/org/keycloak/metrics/utils/AmsCommunication.java b/src/main/java/org/keycloak/metrics/utils/AmsCommunication.java index 60e4ef6..02e198f 100644 --- a/src/main/java/org/keycloak/metrics/utils/AmsCommunication.java +++ b/src/main/java/org/keycloak/metrics/utils/AmsCommunication.java @@ -29,7 +29,7 @@ public class AmsCommunication { private static final List groupEvents = Stream.of(EventType.valueOf(MetricsUtils.GROUP_MEMBERSHIP_CREATE), EventType.valueOf(MetricsUtils.GROUP_MEMBERSHIP_SUSPEND), EventType.valueOf(MetricsUtils.GROUP_MEMBERSHIP_DELETE)).collect(Collectors.toList()); - public static void communicate(RealmModel realm, Event event) throws BadRequestException, IOException { + public static void communicate(RealmModel realm, Event event) throws Exception { //groupEvents are only allowed for top level groups if ((!groupEvents.contains(event.getType())) || StringUtils.countMatches(event.getDetails().get(MetricsUtils.EVENT_GROUP), "/") == 1) { MetricsDto metricsDto = new MetricsDto(event, realm); diff --git a/src/main/java/org/keycloak/metrics/utils/MetricsUtils.java b/src/main/java/org/keycloak/metrics/utils/MetricsUtils.java index dd86f97..781e4fc 100644 --- a/src/main/java/org/keycloak/metrics/utils/MetricsUtils.java +++ b/src/main/java/org/keycloak/metrics/utils/MetricsUtils.java @@ -19,7 +19,8 @@ public class MetricsUtils { public static final String KEYCLOAK_URL = "keycloakUrl"; public static final String EVENT_GROUP = "group"; - public static final String GROUP_MEMBERSHIP_CREATE = "GROUP_MEMBERSHIP_CREATE"; + public static final String METRICS_USER_ID_ATTRIBUTE = "metricsUserIdAttribute"; + public static final String GROUP_MEMBERSHIP_CREATE = "GROUP_MEMBEmetricsUserIdAttributeRSHIP_CREATE"; public static final String GROUP_MEMBERSHIP_DELETE = "GROUP_MEMBERSHIP_DELETE"; public static final String GROUP_MEMBERSHIP_SUSPEND = "GROUP_MEMBERSHIP_SUSPEND"; public static final String LOGIN = "LOGIN";