diff --git a/examples/pom.xml b/examples/pom.xml index 15fd6e26430..c3ad31126fb 100755 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -34,5 +34,6 @@ demo-template + providers diff --git a/examples/providers/audit-listener-sysout/README.md b/examples/providers/audit-listener-sysout/README.md new file mode 100644 index 00000000000..ac89c52e216 --- /dev/null +++ b/examples/providers/audit-listener-sysout/README.md @@ -0,0 +1,4 @@ +Example Audit Listener that prints events to System.out +======================================================= + +To deploy copy target/audit-listener-sysout-example.jar to standalone/deployments/auth-server.war/WEB-INF/lib. Then start (or restart) the server. Once started open the admin console, select your realm, then click on Audit, followed by config. Click on Audit Listeners select box, then pick sysout from the dropdown. After this try to logout and login again to see events printed to System.out. diff --git a/examples/providers/audit-listener-sysout/pom.xml b/examples/providers/audit-listener-sysout/pom.xml new file mode 100755 index 00000000000..386e674345c --- /dev/null +++ b/examples/providers/audit-listener-sysout/pom.xml @@ -0,0 +1,51 @@ + + + examples-providers-pom + org.keycloak + 1.0-beta-1-SNAPSHOT + ../pom.xml + + Audit Listener System.out Example + + 4.0.0 + + audit-listener-sysout-example + jar + + + + org.keycloak + keycloak-core + ${project.version} + + + org.keycloak + keycloak-audit-api + ${project.version} + + + + + audit-listener-sysout-example + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + org.jboss.as.plugins + jboss-as-maven-plugin + 7.1.1.Final + + true + + + + + + + diff --git a/examples/providers/audit-listener-sysout/src/main/java/org/keycloak/examples/providers/audit/SysoutAuditListener.java b/examples/providers/audit-listener-sysout/src/main/java/org/keycloak/examples/providers/audit/SysoutAuditListener.java new file mode 100644 index 00000000000..402b2b9d6e9 --- /dev/null +++ b/examples/providers/audit-listener-sysout/src/main/java/org/keycloak/examples/providers/audit/SysoutAuditListener.java @@ -0,0 +1,72 @@ +package org.keycloak.examples.providers.audit; + +import org.keycloak.audit.AuditListener; +import org.keycloak.audit.Event; +import org.keycloak.audit.EventType; + +import java.util.Map; +import java.util.Set; + +/** + * @author Stian Thorgersen + */ +public class SysoutAuditListener implements AuditListener { + + private Set excludedEvents; + + public SysoutAuditListener(Set excludedEvents) { + this.excludedEvents = excludedEvents; + } + + @Override + public void onEvent(Event event) { + // Ignore excluded events + if (excludedEvents != null && excludedEvents.contains(event.getEvent())) { + return; + } else { + System.out.println("EVENT: " + toString(event)); + } + } + + private String toString(Event event) { + StringBuilder sb = new StringBuilder(); + + sb.append("event="); + sb.append(event.getEvent()); + sb.append(", realmId="); + sb.append(event.getRealmId()); + sb.append(", clientId="); + sb.append(event.getClientId()); + sb.append(", userId="); + sb.append(event.getUserId()); + sb.append(", ipAddress="); + sb.append(event.getIpAddress()); + + if (event.getError() != null) { + sb.append(", error="); + sb.append(event.getError()); + } + + if (event.getDetails() != null) { + for (Map.Entry e : event.getDetails().entrySet()) { + sb.append(", "); + sb.append(e.getKey()); + if (e.getValue() == null || e.getValue().indexOf(' ') == -1) { + sb.append("="); + sb.append(e.getValue()); + } else { + sb.append("='"); + sb.append(e.getValue()); + sb.append("'"); + } + } + } + + return sb.toString(); + } + + @Override + public void close() { + } + +} diff --git a/examples/providers/audit-listener-sysout/src/main/java/org/keycloak/examples/providers/audit/SysoutAuditListenerFactory.java b/examples/providers/audit-listener-sysout/src/main/java/org/keycloak/examples/providers/audit/SysoutAuditListenerFactory.java new file mode 100644 index 00000000000..2871f5014cc --- /dev/null +++ b/examples/providers/audit-listener-sysout/src/main/java/org/keycloak/examples/providers/audit/SysoutAuditListenerFactory.java @@ -0,0 +1,44 @@ +package org.keycloak.examples.providers.audit; + +import org.keycloak.Config; +import org.keycloak.audit.AuditListener; +import org.keycloak.audit.AuditListenerFactory; +import org.keycloak.audit.EventType; +import org.keycloak.provider.ProviderSession; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author Stian Thorgersen + */ +public class SysoutAuditListenerFactory implements AuditListenerFactory { + + private Set excludedEvents; + + @Override + public AuditListener create(ProviderSession providerSession) { + return new SysoutAuditListener(excludedEvents); + } + + @Override + public void init(Config.Scope config) { + String excludes = config.get("excludes"); + if (excludes != null) { + excludedEvents = new HashSet(); + for (String e : excludes.split(",")) { + excludedEvents.add(EventType.valueOf(e)); + } + } + } + + @Override + public void close() { + } + + @Override + public String getId() { + return "sysout"; + } + +} diff --git a/examples/providers/audit-listener-sysout/src/main/resources/META-INF/services/org.keycloak.audit.AuditListenerFactory b/examples/providers/audit-listener-sysout/src/main/resources/META-INF/services/org.keycloak.audit.AuditListenerFactory new file mode 100644 index 00000000000..635efe71816 --- /dev/null +++ b/examples/providers/audit-listener-sysout/src/main/resources/META-INF/services/org.keycloak.audit.AuditListenerFactory @@ -0,0 +1 @@ +org.keycloak.examples.providers.audit.SysoutAuditListenerFactory \ No newline at end of file diff --git a/examples/providers/audit-provider-mem/README.md b/examples/providers/audit-provider-mem/README.md new file mode 100644 index 00000000000..d91dc7f29b7 --- /dev/null +++ b/examples/providers/audit-provider-mem/README.md @@ -0,0 +1,16 @@ +Example Audit Provider that stores events in a List +=================================================== + +To deploy copy target/audit-provider-mem-example.jar to standalone/deployments/auth-server.war/WEB-INF/lib. Then edit standalone/configuration/keycloak-server.json, change: + + "audit": { + "provider": "jpa" + } + +to: + + "audit": { + "provider": "in-mem" + } + +Then start (or restart)the server. Once started open the admin console, select your realm, then click on Audit, followed by config. Set the toggle for Enabled to ON. After this try to logout and login again then open the Audit tab again in the admin console to view events from the in-mem provider. diff --git a/examples/providers/audit-provider-mem/pom.xml b/examples/providers/audit-provider-mem/pom.xml new file mode 100755 index 00000000000..eaac0fc570b --- /dev/null +++ b/examples/providers/audit-provider-mem/pom.xml @@ -0,0 +1,51 @@ + + + examples-providers-pom + org.keycloak + 1.0-beta-1-SNAPSHOT + ../pom.xml + + Audit Provider In-Mem Example + + 4.0.0 + + audit-provider-mem-example + jar + + + + org.keycloak + keycloak-core + ${project.version} + + + org.keycloak + keycloak-audit-api + ${project.version} + + + + + audit-provider-mem-example + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + org.jboss.as.plugins + jboss-as-maven-plugin + 7.1.1.Final + + true + + + + + + + diff --git a/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemAuditProvider.java b/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemAuditProvider.java new file mode 100644 index 00000000000..ddeb1d04484 --- /dev/null +++ b/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemAuditProvider.java @@ -0,0 +1,69 @@ +package org.keycloak.examples.providers.audit; + +import org.keycloak.audit.AuditProvider; +import org.keycloak.audit.Event; +import org.keycloak.audit.EventQuery; +import org.keycloak.audit.EventType; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +/** + * @author Stian Thorgersen + */ +public class MemAuditProvider implements AuditProvider { + private final List events; + private final Set excludedEvents; + + public MemAuditProvider(List events, Set excludedEvents) { + this.events = events; + this.excludedEvents = excludedEvents; + } + + @Override + public EventQuery createQuery() { + return new MemEventQuery(new LinkedList(events)); + } + + @Override + public void clear() { + + } + + @Override + public void clear(String realmId) { + synchronized(events) { + Iterator itr = events.iterator(); + while (itr.hasNext()) { + if (itr.next().getRealmId().equals(realmId)) { + itr.remove(); + } + } + } + } + + @Override + public void clear(String realmId, long olderThan) { + synchronized(events) { + Iterator itr = events.iterator(); + while (itr.hasNext()) { + Event e = itr.next(); + if (e.getRealmId().equals(realmId) && e.getTime() < olderThan) { + itr.remove(); + } + } + } + } + + @Override + public void onEvent(Event event) { + events.add(event); + } + + @Override + public void close() { + } + +} diff --git a/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemAuditProviderFactory.java b/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemAuditProviderFactory.java new file mode 100644 index 00000000000..3ca05fcbd01 --- /dev/null +++ b/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemAuditProviderFactory.java @@ -0,0 +1,53 @@ +package org.keycloak.examples.providers.audit; + +import org.keycloak.Config; +import org.keycloak.audit.AuditProvider; +import org.keycloak.audit.AuditProviderFactory; +import org.keycloak.audit.Event; +import org.keycloak.audit.EventType; +import org.keycloak.provider.ProviderSession; + +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +/** + * @author Stian Thorgersen + */ +public class MemAuditProviderFactory implements AuditProviderFactory { + + private List events; + + private Set excludedEvents; + + @Override + public AuditProvider create(ProviderSession providerSession) { + return new MemAuditProvider(events, excludedEvents); + } + + @Override + public void init(Config.Scope config) { + events = Collections.synchronizedList(new LinkedList()); + + String excludes = config.get("excludes"); + if (excludes != null) { + excludedEvents = new HashSet(); + for (String e : excludes.split(",")) { + excludedEvents.add(EventType.valueOf(e)); + } + } + } + + @Override + public void close() { + events = null; + excludedEvents = null; + } + + @Override + public String getId() { + return "in-mem"; + } +} diff --git a/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemEventQuery.java b/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemEventQuery.java new file mode 100644 index 00000000000..857f30cb984 --- /dev/null +++ b/examples/providers/audit-provider-mem/src/main/java/org/keycloak/examples/providers/audit/MemEventQuery.java @@ -0,0 +1,106 @@ +package org.keycloak.examples.providers.audit; + +import org.keycloak.audit.Event; +import org.keycloak.audit.EventQuery; +import org.keycloak.audit.EventType; + +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +/** + * @author Stian Thorgersen + */ +public class MemEventQuery implements EventQuery { + + private List events; + + private int first; + private int max; + + public MemEventQuery(List events) { + this.events = events; + } + + @Override + public EventQuery event(EventType... events) { + Iterator itr = this.events.iterator(); + while (itr.hasNext()) { + Event next = itr.next(); + for (EventType e : events) { + if (next.getEvent().equals(e)) { + break; + } + } + itr.remove(); + } + return this; + } + + @Override + public EventQuery realm(String realmId) { + Iterator itr = this.events.iterator(); + while (itr.hasNext()) { + if (!itr.next().getRealmId().equals(realmId)) { + itr.remove(); + } + } + return this; + } + + @Override + public EventQuery client(String clientId) { + Iterator itr = this.events.iterator(); + while (itr.hasNext()) { + if (!itr.next().getClientId().equals(clientId)) { + itr.remove(); + } + } + return this; + } + + @Override + public EventQuery user(String userId) { + Iterator itr = this.events.iterator(); + while (itr.hasNext()) { + if (!itr.next().getUserId().equals(userId)) { + itr.remove(); + } + } + return this; + } + + @Override + public EventQuery ipAddress(String ipAddress) { + Iterator itr = this.events.iterator(); + while (itr.hasNext()) { + if (!itr.next().getIpAddress().equals(ipAddress)) { + itr.remove(); + } + } + return this; + } + + @Override + public EventQuery firstResult(int result) { + this.first = result; + return this; + } + + @Override + public EventQuery maxResults(int results) { + this.max = results; + return this; + } + + @Override + public List getResultList() { + if (events.size() < first) { + return Collections.emptyList(); + } + int end = first + max <= events.size() ? first + max : events.size(); + + return events.subList(first, end); + } + +} diff --git a/examples/providers/audit-provider-mem/src/main/resources/META-INF/services/org.keycloak.audit.AuditProviderFactory b/examples/providers/audit-provider-mem/src/main/resources/META-INF/services/org.keycloak.audit.AuditProviderFactory new file mode 100644 index 00000000000..5f03c5747fd --- /dev/null +++ b/examples/providers/audit-provider-mem/src/main/resources/META-INF/services/org.keycloak.audit.AuditProviderFactory @@ -0,0 +1 @@ +org.keycloak.examples.providers.audit.MemAuditProviderFactory \ No newline at end of file diff --git a/examples/providers/pom.xml b/examples/providers/pom.xml new file mode 100755 index 00000000000..ff0cf917f5f --- /dev/null +++ b/examples/providers/pom.xml @@ -0,0 +1,39 @@ + + + examples-pom + org.keycloak + 1.0-beta-1-SNAPSHOT + ../pom.xml + + Provider Examples + + 4.0.0 + + examples-providers-pom + pom + + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + org.jboss.as.plugins + jboss-as-maven-plugin + 7.1.1.Final + + true + + + + + + audit-listener-sysout + audit-provider-mem + +