Giter VIP home page Giter VIP logo

embedded-spring-boot-keycloak-server's Introduction

Embedded Keycloak Server running in a Spring Boot App

This project provides an embedded Authentication and Authorization Server based on Keycloak and Spring Boot.
The idea is to have a variant of Keycloak-X but based on Spring Boot instead of Quarkus.

Keycloak is embedded by hosting it's JAX-RS Application in a Spring-Boot environment.

Compatibility

The following table shows the Keycloak versions used by the embedded Keycloak Server version.

Embedded Keycloak Server Keycloak Spring Boot
1.x.y 9.0.3 2.2.7.RELEASE
2.3.y 10.0.2 2.3.1.RELEASE
2.4.y 11.0.2 2.3.3.RELEASE
3.0.y 12.0.4 2.4.4
4.0.y 13.0.1 2.4.6
5.0.y 15.0.2 2.5.4
5.1.y 15.1.1 2.5.10
6.0.y 16.1.1 2.5.10
7.0.y 17.0.1 2.6.7
8.0.y 18.0.0 2.6.7

Modules

embedded-keycloak-server-spring-boot-support

This module contains the necessary bits to embed a Keycloak server in a Spring Boot app.

embedded-keycloak-server-spring-boot-starter

This module contains a Spring Boot starter for an Embedded Keycloak Server.

embedded-keycloak-server-plain

This is an example module showing the raw embed a Keycloak server in a Spring Boot app without additional customizations.

embedded-keycloak-server-custom

This is an example module showing how to embed a Keycloak server in a Spring Boot app with additional customizations.

Installation

To add Keycloak to a Spring Boot project, add a dependency to the Spring Boot starter and make sure to use this project's BOM/parent so that you're getting all the right dependency versions:

Note that the artifacts are currently distributed via jitpack, see the corresponding jitpack project.

In Maven:

<project ...>
  <parent>
      <groupId>com.github.thomasdarimont.embedded-spring-boot-keycloak-server</groupId>
      <artifactId>embedded-keycloak-server-spring-boot-parent</artifactId>
      <version>8.0.0</version>
  </parent>

  <dependencies>
        <dependency>
            <groupId>com.github.thomasdarimont.embedded-spring-boot-keycloak-server</groupId>
            <artifactId>embedded-keycloak-server-spring-boot-starter</artifactId>
            <version>8.0.0</version>
        </dependency>
  </dependencies>

...

    <repositories>
        <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>
    </repositories>

  ...
</project>

In Gradle:

plugins {
	id 'org.springframework.boot' version '2.6.7'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

repositories {
  mavenCentral()
  maven { url "https://jitpack.io" }
}

dependencyManagement {
  imports {
    mavenBom 'com.github.thomasdarimont.embedded-spring-boot-keycloak-server:embedded-keycloak-server-spring-boot-parent:8.0.0'
  }
}

dependencies {
  implementation "com.github.thomasdarimont.embedded-spring-boot-keycloak-server:embedded-keycloak-server-spring-boot-starter:8.0.0"
}

Make sure you chose a version that matches the Keycloak version you want to use from the compatibility table above.

Build

To build the embedded Spring Boot Keycloak Server, run the following command: Note: we use the install goal to install the artifacts into the local maven repository
in order to be able to consume the artifacts in our customization project.

mvn clean install

Run

To run the plain embedded keycloak server example app, you can execute the following command:

java -jar embedded-keycloak-server-plain/target/*.jar

The embedded Keycloak server is now reachable via http://localhost:8080/auth

Note: If you didn't configure an admin password explicitly, we will generate the password at startup and print it to the console.
You can use this password to login as the user admin.

2020-07-07 16:02:39.531  INFO 13974 --- [           main] c.g.t.k.e.EmbeddedKeycloakApplication    : Generated admin password: 15909ee9-871d-4caf-ad04-5da5f3e0838f		

Configuration

The Keycloak server part can be configured via Spring Boot configuration mechanism.
See embedded-keycloak-server-plain/application.yml for a list of configurable settings.

Customizing

The embedded-keycloak-server-custom example project demonstrates how one can use the
embedded-keycloak-server-spring-boot-starter library to create an embedded Keycloak server with additional
customizations like Keycloak extensions and a custom theme.

Clustering

The embedded Keycloak server uses JGroups for Peer-to-Peer cluster communication and Infinispan for
managing distributed caches like SSO-Sessions etc.

JGroups Clustering can be configured via the jgroups.xml configuration file.
Infinispan distributed caches can be configured via the infinispan.xml configuration file.

By default JGroups is configured with TCPPING discovery which requires a list of initial hostnames to join a cluster. If you want another JGroups discovery mechanism like, e.g. dnsping or kube_ping, then you just need to adapt the jgroups.xml configuration file. Note that some discovery strategies like kube_ping need additional jars in the classpath.

Note, that you need to use a centralized database if you want to really leverage a clustered embedded Keycloak.

To see the clustering in action, just build the project and run the following command on two nodes in the embedded-keycloak-server-plain directory:

Run on Node1:

java -Djgroups.configfile=jgroups.xml \
     -Djgroups.bind_addr=$(hostname -I | cut -d' ' -f1) \
     -Djgroups.tcpping.initial_hosts='node1[7600],node2[7600]' \
     -Djava.net.preferIPv4Stack=true \
     -jar target/*.jar

Run on Node2:

java -Djgroups.configfile=jgroups.xml \
     -Djgroups.bind_addr=$(hostname -I | cut -d' ' -f1) \
     -Djgroups.tcpping.initial_hosts='node1[7600],node2[7600]' \
     -Djava.net.preferIPv4Stack=true \
     -jar target/*.jar

Note, the expression $(hostname -I | cut -d' ' -f1) takes the first host IP address as the bind adress for JGroups.

If the clustering works you should see messages like:

2020-04-19 11:29:16.665  INFO 17055 --- [PN,neumann-3283] org.infinispan.CLUSTER                   : ISPN000094: Received new cluster view for channel ISPN: [neumann-3283|1] (2) [neumann-3283, gauss-45273]
2020-04-19 11:29:16.668  INFO 17055 --- [PN,neumann-3283] org.infinispan.CLUSTER                   : ISPN100000: Node gauss-45273 joined the cluster
2020-04-19 11:29:17.005  INFO 17055 --- [e-thread--p2-t2] org.infinispan.CLUSTER                   : [Context=org.infinispan.CONFIG] ISPN100002: Starting rebalance with members [neumann-3283, gauss-45273], phase READ_OLD_WRITE_ALL, topology id 2
...

Current gotchas

None.

embedded-spring-boot-keycloak-server's People

Contributors

bastoker avatar jmax01 avatar netmikey avatar thomasdarimont avatar wadahiro avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

embedded-spring-boot-keycloak-server's Issues

Plain application fails to start when built with Jetty profile

I build the project with the jetty profile, and run the resulting plain JAR:

$ mvn -P jetty clean install -DskipTests
$ java -jar ./embedded-keycloak-server-plain/target/embedded-keycloak-server-plain-jetty-2.4.0-SNAPSHOT.jar

The server fails to start, producing this log. AFAICT, this is the important part:

Caused by: javax.naming.NameNotFoundException: spring is not bound
  at org.eclipse.jetty.jndi.local.localContextRoot.getContext(localContextRoot.java:177) ~[jetty-jndi-9.4.29.v20200521.jar!/:9.4.29.v20200521]
  at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:370) ~[jetty-jndi-9.4.29.v20200521.jar!/:9.4.29.v20200521]
  at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:379) ~[jetty-jndi-9.4.29.v20200521.jar!/:9.4.29.v20200521]
  at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409) ~[na:na]
  at org.springframework.jndi.JndiTemplate.lambda$lookup$0(JndiTemplate.java:157) ~[spring-context-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
  at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:92) ~[spring-context-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
  at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:157) ~[spring-context-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
  at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:179) ~[spring-context-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
  at com.github.thomasdarimont.keycloak.embedded.support.InfinispanCacheManagerProvider.getCacheManager(InfinispanCacheManagerProvider.java:18) ~[embedded-keycloak-server-spring-boot-support-2.4.0-SNAPSHOT.jar!/:2.4.0-SNAPSHOT]
  ... 59 common frames omitted

However, I have too little experience with Spring and JNDI to figure out who should have bound spring, and why that didn't happen.

Incompatible with Eureka Discovery Client

I was trying to add Eureka Discovery Client to a project but I get this error at runtime

image

So i try to exclude the dependency but without luck

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-ribbon</artifactId>
    </exclusion>
    <exclusion>
      <groupId>com.netflix.ribbon</groupId>
      <artifactId>ribbon-eureka</artifactId>
    </exclusion>
    <exclusion>
      <groupId>javax.ws.rs</groupId>
      <artifactId>jsr311-api</artifactId>
    </exclusion>
  </exclusions>
</dependency>

There are some workaround for this or they are simply incompatible?

Support for Keycloak v12

Keycloak 12.0.0 was released today.
I'm already looking forward for the embedded-spring-boot-keycloak-server project to support it.

Issues with finding default transaction manager

Hello,
I'm using gradle to build the project, but I'm having issues running Keycloak cluster with metrics and perhaps it is related to not finding Jndi configurations.

Your help is highly appreciated:
The first issue I'm seeing is

java.lang.NoClassDefFoundError: org/eclipse/microprofile/config/ConfigProvider
        at org.infinispan.metrics.impl.MetricsCollectorFactory.construct(MetricsCollectorFactory.java:39) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.factories.impl.BasicComponentRegistryImpl.doInstantiateWrapper(BasicComponentRegistryImpl.java:191) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.factories.impl.BasicComponentRegistryImpl.instantiateWrapper(BasicComponentRegistryImpl.java:181) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.factories.impl.BasicComponentRegistryImpl.getComponent0(BasicComponentRegistryImpl.java:146) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.factories.impl.WireContext.get(WireContext.java:20) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.metrics.impl.CorePackageImpl$3.wire(CorePackageImpl.java:71) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.metrics.impl.CorePackageImpl$3.wire(CorePackageImpl.java:67) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.factories.impl.BasicComponentRegistryImpl.invokeInjection(BasicComponentRegistryImpl.java:339) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.factories.impl.BasicComponentRegistryImpl.invokeInjection(BasicComponentRegistryImpl.java:347) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.factories.impl.BasicComponentRegistryImpl.doWireWrapper(BasicComponentRegistryImpl.java:236) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.factories.impl.BasicComponentRegistryImpl.wireWrapper(BasicComponentRegistryImpl.java:217) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.factories.impl.BasicComponentRegistryImpl.registerComponent(BasicComponentRegistryImpl.java:376) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.factories.GlobalComponentRegistry.<init>(GlobalComponentRegistry.java:126) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at org.infinispan.manager.DefaultCacheManager.<init>(DefaultCacheManager.java:374) ~[infinispan-core-11.0.9.Final.jar:11.0.9.Final]
        at com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakConfig.keycloakInfinispanCacheManager(EmbeddedKeycloakConfig.java:73) ~[embedded-keycloak-server-spring-boot-support-4.0.0.jar:4.0.0]
        at com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakConfig$$EnhancerBySpringCGLIB$$a93c9a4b.CGLIB$keycloakInfinispanCacheManager$5(<generated>) ~[embedded-keycloak-server-spring-boot-support-4.0.0.jar:4.0.0]
        at com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakConfig$$EnhancerBySpringCGLIB$$a93c9a4b$$FastClassBySpringCGLIB$$a13947e3.invoke(<generated>) ~[embedded-keycloak-server-spring-boot-support-4.0.0.jar:4.0.0]
        at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.3.7.jar:5.3.7]
        at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-5.3.7.jar:5.3.7]
        at com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakConfig$$EnhancerBySpringCGLIB$$a93c9a4b.keycloakInfinispanCacheManager(<generated>) ~[embedded-keycloak-server-spring-boot-support-4.0.0.jar:4.0.0]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1334) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1380) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1334) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.7.jar:5.3.7]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.7.jar:5.3.7]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.7.jar:5.3.7]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.6.jar:2.4.6]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:771) ~[spring-boot-2.4.6.jar:2.4.6]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:763) ~[spring-boot-2.4.6.jar:2.4.6]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:438) ~[spring-boot-2.4.6.jar:2.4.6]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:339) ~[spring-boot-2.4.6.jar:2.4.6]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) ~[spring-boot-2.4.6.jar:2.4.6]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1318) ~[spring-boot-2.4.6.jar:2.4.6]
        at KeycloakServerApplication.main(KeycloakServerApplication.java:12) ~[main/:na]
Caused by: java.lang.ClassNotFoundException: org.eclipse.microprofile.config.ConfigProvider
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na]
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
        ... 60 common frames omitted

the other issue is related to Jndi

javax.naming.NamingException: Name java:jboss/TransactionManager not found
        at com.github.thomasdarimont.keycloak.embedded.support.KeycloakInitialContext.lambda$lookup$0(KeycloakInitialContext.java:28) ~[embedded-keycloak-server-spring-boot-support-4.0.0.jar:4.0.0]
        at java.base/java.util.Optional.orElseThrow(Optional.java:408) ~[na:na]
        at com.github.thomasdarimont.keycloak.embedded.support.KeycloakInitialContext.lookup(KeycloakInitialContext.java:28) ~[embedded-keycloak-server-spring-boot-support-4.0.0.jar:4.0.0]
        at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409) ~[na:na]
        at org.keycloak.transaction.JBossJtaTransactionManagerLookup.init(JBossJtaTransactionManagerLookup.java:44) ~[keycloak-services-13.0.1.jar:13.0.1]
        at org.keycloak.services.DefaultKeycloakSessionFactory.loadFactories(DefaultKeycloakSessionFactory.java:276) ~[keycloak-services-13.0.1.jar:13.0.1]
        at org.keycloak.services.DefaultKeycloakSessionFactory.init(DefaultKeycloakSessionFactory.java:100) ~[keycloak-services-13.0.1.jar:13.0.1]
        at org.keycloak.services.resources.KeycloakApplication.createSessionFactory(KeycloakApplication.java:218) ~[keycloak-services-13.0.1.jar:13.0.1]
        at org.keycloak.services.resources.KeycloakApplication.startup(KeycloakApplication.java:122) ~[keycloak-services-13.0.1.jar:13.0.1]
        at com.github.thomasdarimont.keycloak.embedded.support.SpringBootPlatformProvider.startup(SpringBootPlatformProvider.java:72) ~[embedded-keycloak-server-spring-boot-support-4.0.0.jar:4.0.0]
        at com.github.thomasdarimont.keycloak.embedded.support.SpringBootPlatformProvider.onApplicationEvent(SpringBootPlatformProvider.java:28) ~[embedded-keycloak-server-spring-boot-support-4.0.0.jar:4.0.0]
        at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) ~[spring-context-5.3.7.jar:5.3.7]
        at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) ~[spring-context-5.3.7.jar:5.3.7]
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) ~[spring-context-5.3.7.jar:5.3.7]
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421) ~[spring-context-5.3.7.jar:5.3.7]
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378) ~[spring-context-5.3.7.jar:5.3.7]
        at org.springframework.boot.context.event.EventPublishingRunListener.running(EventPublishingRunListener.java:111) ~[spring-boot-2.4.6.jar:2.4.6]
        at org.springframework.boot.SpringApplicationRunListeners.lambda$running$6(SpringApplicationRunListeners.java:79) ~[spring-boot-2.4.6.jar:2.4.6]
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na]
        at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:117) ~[spring-boot-2.4.6.jar:2.4.6]
        at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:111) ~[spring-boot-2.4.6.jar:2.4.6]
        at org.springframework.boot.SpringApplicationRunListeners.running(SpringApplicationRunListeners.java:79) ~[spring-boot-2.4.6.jar:2.4.6]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:354) ~[spring-boot-2.4.6.jar:2.4.6]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) ~[spring-boot-2.4.6.jar:2.4.6]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1318) ~[spring-boot-2.4.6.jar:2.4.6]
        at KeycloakServerApplication.main(KeycloakServerApplication.java:12) ~[main/:na]

My application.yml

spring:
  datasource:
    username: root
    password: foo
    url: jdbc:postgresql://localhost:5432/postgres
    hikari:
      maximum-pool-size: 25
      minimum-idle: 1
    Driver-class-name: org.postgresql.Driver
  devtools:
    restart:
      enabled: false
  lifecycle:
    timeout-per-shutdown-phase: 20s
  liquibase:
    enabled: false

management:
  endpoints:
    web:

      base-path: "/manage"


logging:
  level:
    org.jgroups: DEBUG
    org.infinispan: DEBUG
    org.keycloak: DEBUG
    org.keycloak.services.managers.DefaultBruteForceProtector: DEBUG
    org.keycloak.services.scheduled.ClusterAwareScheduledTaskRunner: DEBUG
    org.keycloak.services.managers.UserSessionManager: DEBUG
    org.keycloak.timer.basic: DEBUG
    org.springframework: INFO


server:
  forward-headers-strategy: native
  port: 8080
  servlet:
    context-path: "/"
  shutdown: graceful

keycloak:
  custom:
    server:
      keycloak-path: "/auth"

    infinispan:
      configLocation: "classpath:infinispan.xml"
      cacheManager: jndi

    adminUser:
      username: admin
      password: admin
      create-admin-user-enabled: true

    migration:
      importProvider: singleFile
      importLocation: keycloak-realm-config.json
   # # -Dkeycloak.migration.strategy=OVERWRITE_EXISTING
   # # -Dkeycloak.migration.strategy=IGNORE_EXISTING

  hostname:
    provider: "default"
    default:
      frontendUrl: ""
      adminUrl: ""
      forceBackendUrlToFrontendUrl: false

  admin:
    realm: "master"

  eventsStore:
    provider: "jpa"

  eventsListener:
    "jboss-logging":
      "success-level": "info"
      "error-level": "warn"

  realm:
    provider: "jpa"

  user:
    provider: "jpa"

  userFederatedStorage:
    provider: "jpa"

  userSessionPersister:
    provider: "jpa"

  authorizationPersister:
    provider: "jpa"

  userCache:
    default:
      enabled: true

  timer:
    provider: "basic"

  theme:
    staticMaxAge: "2592000"
    cacheTemplates: true
    cacheThemes: true
    folder:
      enabled: false
      dir: ""

  scheduled:
    interval: 900

  connectionsHttpClient:
    default: {}

  connectionsJpa:
    provider: "default"
    default:
      dataSource: "spring/datasource"
      initializeEmpty: true
      migrationStrategy: "update"
      showSql: false
      formatSqlSql: true
      globalStatsInterval: -1

  realmCache:
    default:
      enabled: true

  mapStorage:
    provider: concurrenthashmap

  client:
    provider: jpa

  role:
    provider: jpa

  connectionsInfinispan:
    default:
      jgroupsUdpMcastAddr: "234.56.78.90"
      nodeName: "localhost"
      siteName: ""
      clustered: fase
      async: false
      sessionsOwners: 1
      l1Lifespan: 600000
      remoteStoreEnabled: false
      remoteStoreHost: "localhost"
      remoteStorePort: 11222
      hotrodProtocolVersion: ""

  scripting: {}

  "jta-lookup":
    provider: "jboss"
    jboss:
      enabled: true

  "login-protocol":
    "saml":
      "knownProtocols": ["http=${server.port}", "https=${server.port}"]

  "x509cert-lookup":
    provider: "default"
    default:
      enabled: true

      haproxy:
        enabled: true
        sslClientCert: "x-ssl-client-cert"
        sslCertChainPrefix: "x-ssl-client-cert-chain"
        certificateChainLength: 1

      apache:
        enabled: true
        sslClientCert: "x-ssl-client-cert"
        sslCertChainPrefix: "x-ssl-client-cert-chain"
        certificateChainLength: 1

      nginx:
        enabled: true
        sslClientCert: "x-ssl-client-cert"
        sslCertChainPrefix: "x-ssl-client-cert-chain"
        certificateChainLength: 1

Error on upgrade to 5.0.2

I've upgraded from 4.0.0 to 5.0.2, past upgrades went smooth but in this upgrade, whether with prior version's database or none for a new one, I am getting the following error:

2021-10-28 13:05:20.568  WARN 368 --- [           main] io.undertow.websockets.jsr               : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2021-10-28 13:05:20.585  INFO 368 --- [           main] io.undertow.servlet                      : Initializing Spring embedded WebApplicationContext
2021-10-28 13:05:20.585  INFO 368 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1752 ms
2021-10-28 13:05:20.732  INFO 368 --- [           main] c.g.t.k.embedded.EmbeddedKeycloakConfig  : Could not find profile.properties on classpath.
2021-10-28 13:05:21.158  INFO 368 --- [           main] c.g.t.k.embedded.EmbeddedKeycloakConfig  : Using infinispan configuration from jar:file:/C:/Users/erich/.m2/repository/com/github/thomasdarimont/embedded-spring-boot-keycloak-server/embedded-keycloak-server-spring-boot-support/5.0.2/embedded-keycloak-server-spring-boot-support-5.0.2.jar!/infinispan.xml
2021-10-28 13:05:21.725  WARN 368 --- [           main] org.infinispan.PERSISTENCE               : ISPN000554: jboss-marshalling is deprecated and planned for removal
2021-10-28 13:05:21.744  INFO 368 --- [           main] org.infinispan.CONTAINER                 : ISPN000556: Starting user marshaller 'org.infinispan.commons.marshall.ImmutableProtoStreamMarshaller'
2021-10-28 13:05:21.804  INFO 368 --- [           main] org.infinispan.CONTAINER                 : ISPN000128: Infinispan version: Infinispan 'Taedonggang' 12.1.7.Final
2021-10-28 13:05:21.905  INFO 368 --- [           main] org.infinispan.CLUSTER                   : ISPN000078: Starting JGroups channel ISPN with stack jgroups
2021-10-28 13:05:24.606  INFO 368 --- [           main] org.jgroups.protocols.pbcast.GMS         : Corsair-60971: no members discovered after 2014 ms: creating cluster as coordinator
2021-10-28 13:05:24.612  INFO 368 --- [           main] org.infinispan.CLUSTER                   : ISPN000094: Received new cluster view for channel ISPN: [Corsair-60971|0] (1) [Corsair-60971]
2021-10-28 13:05:24.616  INFO 368 --- [           main] org.infinispan.CLUSTER                   : ISPN000079: Channel ISPN local address is Corsair-60971, physical addresses are [192.168.158.1:63518]
2021-10-28 13:05:25.038  INFO 368 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 1 endpoint(s) beneath base path '/actuator'
2021-10-28 13:05:25.190  INFO 368 --- [           main] org.jboss.resteasy.resteasy_jaxrs.i18n   : RESTEASY002225: Deploying javax.ws.rs.core.Application: class com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakApplication
2021-10-28 13:05:25.191  INFO 368 --- [           main] org.jboss.resteasy.resteasy_jaxrs.i18n   : RESTEASY002205: Adding provider class org.keycloak.services.error.KeycloakErrorHandler from Application class com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakApplication
2021-10-28 13:05:25.192  INFO 368 --- [           main] org.jboss.resteasy.resteasy_jaxrs.i18n   : RESTEASY002200: Adding class resource org.keycloak.services.resources.ThemeResource from Application class com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakApplication
2021-10-28 13:05:25.192  INFO 368 --- [           main] org.jboss.resteasy.resteasy_jaxrs.i18n   : RESTEASY002200: Adding class resource org.keycloak.services.resources.JsResource from Application class com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakApplication
2021-10-28 13:05:25.192  INFO 368 --- [           main] org.jboss.resteasy.resteasy_jaxrs.i18n   : RESTEASY002205: Adding provider class org.keycloak.services.filters.KeycloakSecurityHeadersFilter from Application class com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakApplication
2021-10-28 13:05:25.192  INFO 368 --- [           main] org.jboss.resteasy.resteasy_jaxrs.i18n   : RESTEASY002220: Adding singleton resource org.keycloak.services.resources.RealmsResource from Application class com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakApplication
2021-10-28 13:05:25.193  INFO 368 --- [           main] org.jboss.resteasy.resteasy_jaxrs.i18n   : RESTEASY002210: Adding provider singleton org.keycloak.services.util.ObjectMapperResolver from Application class com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakApplication
2021-10-28 13:05:25.193  INFO 368 --- [           main] org.jboss.resteasy.resteasy_jaxrs.i18n   : RESTEASY002220: Adding singleton resource org.keycloak.services.resources.admin.AdminRoot from Application class com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakApplication
2021-10-28 13:05:25.193  INFO 368 --- [           main] org.jboss.resteasy.resteasy_jaxrs.i18n   : RESTEASY002220: Adding singleton resource org.keycloak.services.resources.WelcomeResource from Application class com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakApplication
2021-10-28 13:05:25.193  INFO 368 --- [           main] org.jboss.resteasy.resteasy_jaxrs.i18n   : RESTEASY002220: Adding singleton resource org.keycloak.services.resources.RobotsResource from Application class com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakApplication
2021-10-28 13:05:25.411  INFO 368 --- [           main] org.apache.wicket.Application            : [wicketFilter] init: Wicket core library initializer
2021-10-28 13:05:25.412  INFO 368 --- [           main] org.apache.wicket.Application            : [wicketFilter] init: Wicket extensions initializer
2021-10-28 13:05:25.482  INFO 368 --- [           main] o.a.wicket.protocol.http.WebApplication  : [wicketFilter] Started Wicket version 9.4.0 in DEPLOYMENT mode
2021-10-28 13:05:25.484  INFO 368 --- [           main] io.undertow                              : starting server: Undertow - 2.2.10.Final
2021-10-28 13:05:25.499  INFO 368 --- [           main] org.xnio                                 : XNIO version 3.8.4.Final
2021-10-28 13:05:25.506  INFO 368 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.8.4.Final
2021-10-28 13:05:25.553  INFO 368 --- [           main] org.jboss.threads                        : JBoss Threads version 2.3.3.Final
2021-10-28 13:05:25.598  INFO 368 --- [           main] o.s.b.w.e.undertow.UndertowWebServer     : Undertow started on port(s) 8080 (http)
2021-10-28 13:05:25.689  INFO 368 --- [           main] o.k.url.DefaultHostnameProviderFactory   : Frontend: <request>, Admin: <frontend>, Backend: <request>
2021-10-28 13:05:26.037  INFO 368 --- [           main] faultInfinispanConnectionProviderFactory : Node name: Corsair-60971, Site name: null
2021-10-28 13:05:26.065 ERROR 368 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IncompatibleClassChangeError: Method 'liquibase.servicelocator.ServiceLocator liquibase.servicelocator.ServiceLocator.getInstance()' must be InterfaceMethodref constant
	at org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider.baseLiquibaseInitialization(DefaultLiquibaseConnectionProvider.java:84) ~[keycloak-model-jpa-15.0.2.jar:15.0.2]
	at org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider.create(DefaultLiquibaseConnectionProvider.java:75) ~[keycloak-model-jpa-15.0.2.jar:15.0.2]
	at org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider.create(DefaultLiquibaseConnectionProvider.java:57) ~[keycloak-model-jpa-15.0.2.jar:15.0.2]
	at org.keycloak.services.DefaultKeycloakSession.getProvider(DefaultKeycloakSession.java:316) ~[keycloak-services-15.0.2.jar:15.0.2]
	at org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.lazyInit(LiquibaseDBLockProvider.java:62) ~[keycloak-model-jpa-15.0.2.jar:15.0.2]
	at org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.lambda$waitForLock$2(LiquibaseDBLockProvider.java:96) ~[keycloak-model-jpa-15.0.2.jar:15.0.2]
	at org.keycloak.models.utils.KeycloakModelUtils.suspendJtaTransaction(KeycloakModelUtils.java:758) ~[keycloak-server-spi-private-15.0.2.jar:15.0.2]
	at org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.waitForLock(LiquibaseDBLockProvider.java:94) ~[keycloak-model-jpa-15.0.2.jar:15.0.2]
	at org.keycloak.services.resources.KeycloakApplication$1.run(KeycloakApplication.java:134) ~[keycloak-services-15.0.2.jar:15.0.2]
	at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:250) ~[keycloak-server-spi-private-15.0.2.jar:15.0.2]
	at org.keycloak.services.resources.KeycloakApplication.startup(KeycloakApplication.java:128) ~[keycloak-services-15.0.2.jar:15.0.2]
	at com.github.thomasdarimont.keycloak.embedded.support.SpringBootPlatformProvider.startup(SpringBootPlatformProvider.java:72) ~[embedded-keycloak-server-spring-boot-support-5.0.2.jar:5.0.2]
	at com.github.thomasdarimont.keycloak.embedded.support.SpringBootPlatformProvider.onApplicationEvent(SpringBootPlatformProvider.java:28) ~[embedded-keycloak-server-spring-boot-support-5.0.2.jar:5.0.2]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) ~[spring-context-5.3.9.jar:5.3.9]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) ~[spring-context-5.3.9.jar:5.3.9]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) ~[spring-context-5.3.9.jar:5.3.9]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421) ~[spring-context-5.3.9.jar:5.3.9]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378) ~[spring-context-5.3.9.jar:5.3.9]
	at org.springframework.boot.context.event.EventPublishingRunListener.running(EventPublishingRunListener.java:111) ~[spring-boot-2.5.4.jar:2.5.4]
	at org.springframework.boot.SpringApplicationRunListeners.lambda$running$6(SpringApplicationRunListeners.java:79) ~[spring-boot-2.5.4.jar:2.5.4]
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na]
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:117) ~[spring-boot-2.5.4.jar:2.5.4]
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:111) ~[spring-boot-2.5.4.jar:2.5.4]
	at org.springframework.boot.SpringApplicationRunListeners.running(SpringApplicationRunListeners.java:79) ~[spring-boot-2.5.4.jar:2.5.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:353) ~[spring-boot-2.5.4.jar:2.5.4]

2021-10-28 13:05:26.069  INFO 368 --- [           main] io.undertow                              : stopping server: Undertow - 2.2.10.Final
2021-10-28 13:05:26.077  INFO 368 --- [           main] org.apache.wicket.Application            : [wicketFilter] destroy: Wicket core library initializer
2021-10-28 13:05:26.078  INFO 368 --- [           main] org.apache.wicket.Application            : [wicketFilter] destroy: Wicket extensions initializer
2021-10-28 13:05:26.090  INFO 368 --- [           main] o.i.manager.DefaultCacheManager          : Stopping cache manager null on Corsair-60971
2021-10-28 13:05:26.102  INFO 368 --- [           main] org.infinispan.CLUSTER                   : ISPN000080: Disconnecting JGroups channel ISPN

Test failure at EmbeddedSpringBootKeycloakServerXApplicationTests

Hi there!

This project looks very promising and I'm looking forward to it!

I just did a fresh git clone based on master and executing mvn clean install but it failed here:

07:14:33.763 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [com.github.thomasdarimont.keycloak.EmbeddedSpringBootKeycloakServerXApplicationTests]: class path resource [com/github/thomasdarimont/keycloak/EmbeddedSpringBootKeycloakServerXApplicationTestsContext.groovy] does not exist
07:14:33.765 [main] INFO org.springframework.test.context.support.AbstractContextLoader - Could not detect default resource locations for test class [com.github.thomasdarimont.keycloak.EmbeddedSpringBootKeycloakServerXApplicationTests]: no resource found for suffixes {-context.xml, Context.groovy}.
07:14:33.767 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class [com.github.thomasdarimont.keycloak.EmbeddedSpringBootKeycloakServerXApplicationTests]: EmbeddedSpringBootKeycloakServerXApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
07:14:33.771 [main] DEBUG org.springframework.test.context.support.ActiveProfilesUtils - Could not find an 'annotation declaring class' for annotation type [org.springframework.test.context.ActiveProfiles] and class [com.github.thomasdarimont.keycloak.EmbeddedSpringBootKeycloakServerXApplicationTests]
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.842 s <<< FAILURE! - in com.github.thomasdarimont.keycloak.EmbeddedSpringBootKeycloakServerXApplicationTests
[ERROR] com.github.thomasdarimont.keycloak.EmbeddedSpringBootKeycloakServerXApplicationTests  Time elapsed: 0.841 s  <<< ERROR!
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

My Java version used on Mac:

openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.7+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.7+10, mixed mode)

Failed to load ApplicationContext in junit

need to investigate, but as for documentation.

java.lang.IllegalStateException: Failed to load ApplicationContext

	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124)
	at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190)
	at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244)
	at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:138)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$6(ClassBasedTestDescriptor.java:350)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor$$Lambda$552/0x0000000000000000.execute(Unknown Source)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:355)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$7(ClassBasedTestDescriptor.java:350)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor$$Lambda$282/0x0000000000000000.accept(Unknown Source)
	at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator$$Lambda$120/0x0000000000000000.accept(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:497)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:487)
	at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312)
	at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:740)
	at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:739)
	at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:349)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$4(ClassBasedTestDescriptor.java:270)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor$$Lambda$281/0x0000000000000000.execute(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:269)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$2(ClassBasedTestDescriptor.java:259)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor$$Lambda$274/0x0000000000000000.get(Unknown Source)
	at java.base/java.util.Optional.orElseGet(Optional.java:369)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$3(ClassBasedTestDescriptor.java:258)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor$$Lambda$254/0x0000000000000000.getTestInstances(Unknown Source)
	at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:101)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$273/0x0000000000000000.execute(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:100)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:65)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:111)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$535/0x0000000000000000.execute(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:111)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:79)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$211/0x0000000000000000.accept(Unknown Source)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$549/0x0000000000000000.execute(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$548/0x0000000000000000.invoke(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$547/0x0000000000000000.execute(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$211/0x0000000000000000.accept(Unknown Source)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$549/0x0000000000000000.execute(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$548/0x0000000000000000.invoke(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$547/0x0000000000000000.execute(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator$$Lambda$172/0x0000000000000000.accept(Unknown Source)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
	at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:221)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Caused by: java.lang.NullPointerException
	at com.github.thomasdarimont.keycloak.embedded.support.SpringBootPlatformProvider.startup(SpringBootPlatformProvider.java:62)
	at com.github.thomasdarimont.keycloak.embedded.support.SpringBootPlatformProvider.onApplicationEvent(SpringBootPlatformProvider.java:24)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)
	at org.springframework.boot.context.event.EventPublishingRunListener.running(EventPublishingRunListener.java:111)
	at org.springframework.boot.SpringApplicationRunListeners.lambda$running$6(SpringApplicationRunListeners.java:79)
	at org.springframework.boot.SpringApplicationRunListeners$$Lambda$1560/0x0000000000000000.accept(Unknown Source)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:117)
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:111)
	at org.springframework.boot.SpringApplicationRunListeners.running(SpringApplicationRunListeners.java:79)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:341)
	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:123)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
	... 84 more

embedded-spring-boot-keycloak-server: 3.0.1 (updated from 2.4.0, there this test is green)
junit-jupiter:jar:5.7.1

@SpringBootTest
class KeycloakIdApplicationTests {

	@Test
	void contextLoads() {
	}
}

How to configure KeyCloak Remote User Storage SPI in Spring Boot Embedded KeyCloak

Hi All,

First of all thanks so much for this awesome project and it is a life saver!

Previously, I have the KeyCloak User Storage Provider implemented in a separate project, deployed the built jar to standalone/deployments and have it call an external REST API for external login and all things are working well.

Now I have this awesome project that embeds KeyCloak in SpringBoot running as well and wanted to integrate my User Storage implementation inside the Spring Boot Embedded server. I integrated all the classes and src/resources/META-INF/services/... files and the server is built properly and also comes up properly. I could login using the admin user.

The question is how do I configure and tell the embedded KeyCloak to invoke my User Storage SPI implementation in either json config file or the application.yml file?

Amy help would be greatly appreciated!

Regards,

Binit Datta

CVE-2021-4133 Security vulnerability

Yesterday a security vulnerability was found and reported on Keycloak's blog.
https://www.keycloak.org/2021/12/cve.html

This impacts all versions of keycloak from 12.0.0 and before 15.1.1.
This means that version 5.0.2 of this project has the vulnerability as it is still on 15.0.2.

Are there any plans for a short term upgrade to version 16.1.0 of keycloak?

Remove Undertow dependency when using Jetty profile

Here Undertow starter is specified as a dependency, meaning that it is a part of both profiles. Instead, we should specify it as a dependency for the undertow profile (this is already done), and possibly mark that profile as the default (so that we don't break the dependent projects).

Keycloak admin endpoint

Hi,

I don't have the impression that we can modify all the keycloak configuration through the application.yml.

What I want to change is the https://github.com/keycloak/keycloak-documentation/blob/master/server_admin/topics/threat/admin.adoc, is there any other place where you can change the configuration?

I've looked at the embedded-keycloak-server-custom to see all the options available but I don't seem to find the one I'm looking for. Is there a doc somewhere with more options that can be passed into the application.yml?

Theme not applied

Hey all,

I might have not read the documentation properly and apologise in advance if this is the case.
I am trying to apply a theme at runtime when the server is started.
The login theme is loaded correctly and when I access the portal manually I can apply it and everything works as expected.
However I cannot do the same when loading the configuration from my realm.json file

Theme called modern

image

in realm.json I have

"loginTheme": "modern",

and within the client still in realm.json

"attributes": {
        "login_theme": "modern",
        ...
}

keycloak-themes.json

{
  "themes": [
    {
      "name": "modern",
      "types": ["login"]
    }
  ]
}

What am I missing? Why when I start the app the theme is not applied automatically and still need a manual input??

Mixing with org.keycloak:keycloak-spring-boot-starter

when I set these properties:
keycloak:
realm: xxxx
auth-server-url: http://localhost:9999/auth
ssl-required: none
resource: xxxx-app
public-client: true

Then embedded gets confused over missing properties:
`APPLICATION FAILED TO START


Description:

Binding to target [Bindable@1842679 type = org.keycloak.adapters.springboot.KeycloakSpringBootProperties, value = 'provided', annotations = array[@org.springframework.boot.context.properties.ConfigurationProperties(ignoreInvalidFields=false, ignoreUnknownFields=false, prefix=keycloak, value=keycloak)]] failed:

Property: keycloak.admin.realm
Value: master
Origin: class path resource [keycloak-defaults.yml] from embedded-keycloak-server-spring-boot-support-4.0.0.jar - 12:12
Reason: The elements [keycloak.admin.realm,keycloak.authorizationpersister.provider,keycloak.client.provider,keycloak.connectionshttpclient.default,keycloak.connectionsinfinispan.default.async,keycloak.connectionsinfinispan.default.clustered,keycloak.connectionsinfinispan.default.hotrodprotocolversion,keycloak.connectionsinfinispan.default.jgroupsudpmcastaddr,keycloak.connectionsinfinispan.default.l1lifespan,keycloak.connectionsinfinispan.default.nodename,keycloak.connectionsinfinispan.default.remotestoreenabled,keycloak.connectionsinfinispan.default.remotestorehost,keycloak.connectionsinfinispan.default.remotestoreport,keycloak.connectionsinfinispan.default.sessionsowners,keycloak.connectionsinfinispan.default.sitename,keycloak.connectionsjpa.default.datasource,keycloak.connectionsjpa.default.formatsql,keycloak.connectionsjpa.default.globalstatsinterval,keycloak.connectionsjpa.default.initializeempty,keycloak.connectionsjpa.default.migrationstrategy,keycloak.connectionsjpa.default.showsql,keycloak.connectionsjpa.provider,keycloak.eventslistener.jboss-logging.error-level,keycloak.eventslistener.jboss-logging.success-level,keycloak.eventsstore.provider,keycloak.hostname.default.adminurl,keycloak.hostname.default.forcebackendurltofrontendurl,keycloak.hostname.default.frontendurl,keycloak.hostname.provider,keycloak.jta-lookup.jboss.enabled,keycloak.jta-lookup.provider,keycloak.login-protocol.saml.knownprotocols[0],keycloak.login-protocol.saml.knownprotocols[1],keycloak.mapstorage.provider,keycloak.realm.provider,keycloak.realmcache.default.enabled,keycloak.role.provider,keycloak.scheduled.interval,keycloak.scripting,keycloak.theme.cachetemplates,keycloak.theme.cachethemes,keycloak.theme.folder.dir,keycloak.theme.folder.enabled,keycloak.theme.staticmaxage,keycloak.timer.provider,keycloak.user.provider,keycloak.usercache.default.enabled,keycloak.userfederatedstorage.provider,keycloak.usersessionpersister.provider,keycloak.x509cert-lookup.default.apache.certificatechainlength,keycloak.x509cert-lookup.default.apache.enabled,keycloak.x509cert-lookup.default.apache.sslcertchainprefix,keycloak.x509cert-lookup.default.apache.sslclientcert,keycloak.x509cert-lookup.default.enabled,keycloak.x509cert-lookup.default.haproxy.certificatechainlength,keycloak.x509cert-lookup.default.haproxy.enabled,keycloak.x509cert-lookup.default.haproxy.sslcertchainprefix,keycloak.x509cert-lookup.default.haproxy.sslclientcert,keycloak.x509cert-lookup.default.nginx.certificatechainlength,keycloak.x509cert-lookup.default.nginx.enabled,keycloak.x509cert-lookup.default.nginx.sslcertchainprefix,keycloak.x509cert-lookup.default.nginx.sslclientcert,keycloak.x509cert-lookup.provider] were left unbound.
Property: keycloak.authorizationpersister.provider
Value: jpa

`
I suspect it because the configurations are the same, any pointers on what todo?

NPE from SpringBootPlatformProvider startup()

Trying to get a setup deployed as a tomcat war and not a standalone boot app. But running in to a type of race condition regarding startup of Springs app context and the HttpServlet30Dispatcher.

But now I'm starting to suspect that I'm missing something fundamental to how the SpringBootPlatformProvider is initiated?

So basically the Runnable onStartup is null when the SpringBootPlatformProvider.onApplicationEvent() triggers the startup() call and tries to:

    protected void startup() {
        tmpDir = createTempDir();
        onStartup.run();
    }

So when running as a tomcat war it looks like the EmbeddedKeycloakApplication is initiated after the ApplicationReadyEvent is triggered ?

So how how does this wiring actually work as a standalone boot app 🤔

Work with sensible defaults out of the box

In the spirit of Spring Boot, I think the embedded server, while being fully configurable, should "just work" with sensible defaults out of the box.

When I include the starter in a blank Spring Boot project and start it, I get the following error:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springBeansJndiContextFactory' defined in class path resource [com/github/thomasdarimont/keycloak/embedded/EmbeddedKeycloakConfig.class]: Unsatisfied dependency expressed through method 'springBeansJndiContextFactory' parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'keycloakInfinispanCacheManager' defined in class path resource [com/github/thomasdarimont/keycloak/embedded/EmbeddedKeycloakConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.infinispan.manager.DefaultCacheManager]: Factory method 'keycloakInfinispanCacheManager' threw exception; nested exception is java.lang.NullPointerException
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:797) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:538) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:893) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
        at com.example.Application.main(Application.java:9) ~[main/:na]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'keycloakInfinispanCacheManager' defined in class path resource [com/github/thomasdarimont/keycloak/embedded/EmbeddedKeycloakConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.infinispan.manager.DefaultCacheManager]: Factory method 'keycloakInfinispanCacheManager' threw exception; nested exception is java.lang.NullPointerException
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:655) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:635) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1304) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1224) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:884) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:788) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        ... 20 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.infinispan.manager.DefaultCacheManager]: Factory method 'keycloakInfinispanCacheManager' threw exception; nested exception is java.lang.NullPointerException
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:650) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        ... 34 common frames omitted
Caused by: java.lang.NullPointerException: null
        at com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakConfig.keycloakInfinispanCacheManager(EmbeddedKeycloakConfig.java:58) ~[embedded-keycloak-server-spring-boot-support-2.2.0-SNAPSHOT.jar:2.2.0-SNAPSHOT]
        at com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakConfig$$EnhancerBySpringCGLIB$$a7e71216.CGLIB$keycloakInfinispanCacheManager$4(<generated>) ~[embedded-keycloak-server-spring-boot-support-2.2.0-SNAPSHOT.jar:2.2.0-SNAPSHOT]
        at com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakConfig$$EnhancerBySpringCGLIB$$a7e71216$$FastClassBySpringCGLIB$$8a4ec253.invoke(<generated>) ~[embedded-keycloak-server-spring-boot-support-2.2.0-SNAPSHOT.jar:2.2.0-SNAPSHOT]
        at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        at com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakConfig$$EnhancerBySpringCGLIB$$a7e71216.keycloakInfinispanCacheManager(<generated>) ~[embedded-keycloak-server-spring-boot-support-2.2.0-SNAPSHOT.jar:2.2.0-SNAPSHOT]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
        ... 35 common frames omitted

It seems to be caused by missing infinispan-related configuration in Spring's application.properties/yml.

I think we'd make onboarding easier if we'd configure a local, single-node infinispan set-up by default.

(This, of course, is also true for default configurations of jgroups etc.)

[5.0.2] too many redirects

When I try to access:
http://localhost:9999/auth
I get thrown towards:
http://localhost:9999/auth/realms/ccadmin/protocol/openid-connect/auth?response_type=code&client_id=ccadmin-backend&scope=openid%20profile&state=YiYSSxZKTuNByiRRb0WF0ExKsAp_fbSWcOQi6bccG3E%3D&redirect_uri=http://localhost:9999/login/oauth2/code/ccadmin&nonce=Dlsma9mE3foZUseTSua3TLe37IirZkO30Rw2X_wk6U4 Which then redirects towards:
http://localhost:9999/oauth2/authorization/ccadmin

So something is off, I have added
web.ignoring().antMatchers("/auth/**","/oauth2/**");
to my WebSecurityConfigurerAdapter as I am running with security on /api/**

I also find it a bit strange that when accessing http://localhost:9999/auth it mixes up my product realm (ccadmin) instead of master...

I had it working with keycloak 11.

EmbeddedSpringBootKeycloakServerXApplicationTests fails in master branch

While running a build on current master branch it was not successful. The EmbeddedSpringBootKeycloakServerXApplicationTests failed and broke the build.

Bildschirmfoto 2021-06-27 um 01 29 06

The fix for this issue could be

  • to move the failing test class into the same package as the Main.java file. com.github.thomasdarimont.keycloak --> com.github.thomasdarimont.keycloak.embedded.runner
  • or specify the Main.class explicitly in the @SpringBootTest annotation:
@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,
    classes = Main.class
)

Also GitHub Actions is showing this.
A pipeline should be in place to make such kind of things more visible.
Have a look to your PRs.

Support for Keycloak v13

Keycloak 13.0.0 was released today.
It would be awesome if embedded-spring-boot-keycloak-server could add support for it 👍

Reusable Spring Boot starter and configuration defaults

Hi Thomas,

I highly welcome this project's initiative! I was working on migrating your spring-boot-keycloak-server-example proof-of-concept project to Keycloak 9 by myself but now that Keycloak introduced what seems like a platform abstraction layer, a Spring Boot adapter project like this one is the perfect fit.

A quick question: spring-boot-keycloak-server-example clearly stated that it was merely a proof-of-concept and not production-ready. Does embedded-spring-boot-keycloak-server aim at being usable for production?

After having a first look through the project, I'd like to suggest a couple of improvements to make it easily reusable in a spring-boot fashion.

  • Add a Spring Boot starter module, e.g. embedded-spring-boot-keycloak-server-starter. It would transitively depend on the Keycloak libraries. It would also include some Autoconfiguration that would spin up Keycloak with Spring Boot's default datasource and without (or single-node) clustering. That way, a blank Spring Boot project could turn into Keycloak by merely depending on the starter project. Of course, it would then add its own customisation.
  • The above would require a complete set of default configuration settings. Especially the contents of application.yml and the infinispan.xml and jgroups.xml should come with sensible defaults. Of course, the consuming project could overwrite anything the usual Spring Boot way.
  • Publish the starter on maven central so it can be used without having to clone this project's repository.

If these are on your roadmap anyway, feel free to ignore me and keep up the great work!

error ldap test connection

Trying to configure ldap failed in Test connection with valid url:

Failed to instantiate [com.sun.jndi.ldap.LdapCtxFactory]: Is the constructor accessible?; nested exception is java.lang.IllegalAccessException: class org.springframework.beans.BeanUtils cannot access class com.sun.jndi.ldap.LdapCtxFactory (in module java.naming) because module java.naming does not export com.sun.jndi.ldap to unnamed module @21507a04

java.nio.file.NoSuchFileException: myproject-0.0.0.jar!\BOOT-INF\lib\keycloak-model-jpa-18.0.0.jar

I'm using a shaded jar which contains my project plus the embedded keycloak server. For the several past versions (embedded keycloak), I get the following error on startup logging of the uberjar, but all works, but I thought it would be good to figure out what is going on here.

java.nio.file.NoSuchFileException: D:\projects\myproject\target\myproject-0.0.0.jar!\BOOT-INF\lib\keycloak-model-jpa-18.0.0.jar
        at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85) ~[na:na]
        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103) ~[na:na]
        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108) ~[na:na]
        at java.base/sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(WindowsFileAttributeViews.java:53) ~[na:na]
        at java.base/sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(WindowsFileAttributeViews.java:38) ~[na:na]
        at java.base/sun.nio.fs.WindowsFileSystemProvider.readAttributes(WindowsFileSystemProvider.java:199) ~[na:na]
        at java.base/java.nio.file.Files.readAttributes(Files.java:1851) ~[na:na]
        at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1264) ~[na:na]
        at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:709) ~[na:na]
        at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:243) ~[na:na]
        at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:172) ~[na:na]
        at java.base/java.util.jar.JarFile.<init>(JarFile.java:347) ~[na:na]
        at java.base/java.util.jar.JarFile.<init>(JarFile.java:318) ~[na:na]
        at java.base/java.util.jar.JarFile.<init>(JarFile.java:257) ~[na:na]
        at org.hibernate.boot.archive.internal.JarFileBasedArchiveDescriptor.resolveJarFileReference(JarFileBasedArchiveDescriptor.java:168) ~[hibernate-core-5.6.9.Final.jar!/:5.6.9.Final]
        at org.hibernate.boot.archive.internal.JarFileBasedArchiveDescriptor.visitArchive(JarFileBasedArchiveDescriptor.java:51) ~[hibernate-core-5.6.9.Final.jar!/:5.6.9.Final]
        at org.hibernate.boot.archive.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:48) ~[hibernate-core-5.6.9.Final.jar!/:5.6.9.Final]
        at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:76) ~[hibernate-core-5.6.9.Final.jar!/:5.6.9.Final]
        at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:107) ~[hibernate-core-5.6.9.Final.jar!/:5.6.9.Final]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:269) ~[hibernate-core-5.6.9.Final.jar!/:5.6.9.Final]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:189) ~[hibernate-core-5.6.9.Final.jar!/:5.6.9.Final]
        at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:75) ~[hibernate-core-5.6.9.Final.jar!/:5.6.9.Final]
        at org.keycloak.connections.jpa.util.JpaUtils.createEntityManagerFactory(JpaUtils.java:72) ~[keycloak-model-jpa-18.0.0.jar!/:18.0.0]
        at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.lambda$lazyInit$0(DefaultJpaConnectionProviderFactory.java:240) ~[keycloak-model-jpa-18.0.0.jar!/:18.0.0]
        at org.keycloak.models.utils.KeycloakModelUtils.suspendJtaTransaction(KeycloakModelUtils.java:756) ~[keycloak-server-spi-private-18.0.0.jar!/:18.0.0]
        at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.lazyInit(DefaultJpaConnectionProviderFactory.java:163) ~[keycloak-model-jpa-18.0.0.jar!/:18.0.0]
        at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.create(DefaultJpaConnectionProviderFactory.java:88) ~[keycloak-model-jpa-18.0.0.jar!/:18.0.0]
        at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.create(DefaultJpaConnectionProviderFactory.java:66) ~[keycloak-model-jpa-18.0.0.jar!/:18.0.0]
        at org.keycloak.services.DefaultKeycloakSession.getProvider(DefaultKeycloakSession.java:316) ~[keycloak-services-18.0.0.jar!/:18.0.0]
        at org.keycloak.models.jpa.JpaRealmProviderFactory.create(JpaRealmProviderFactory.java:64) ~[keycloak-model-jpa-18.0.0.jar!/:18.0.0]
        at org.keycloak.models.jpa.JpaRealmProviderFactory.create(JpaRealmProviderFactory.java:40) ~[keycloak-model-jpa-18.0.0.jar!/:18.0.0]
        at org.keycloak.services.DefaultKeycloakSession.getProvider(DefaultKeycloakSession.java:316) ~[keycloak-services-18.0.0.jar!/:18.0.0]
        at org.keycloak.services.DefaultKeycloakSession.realmLocalStorage(DefaultKeycloakSession.java:228) ~[keycloak-services-18.0.0.jar!/:18.0.0]
        at org.keycloak.models.cache.infinispan.RealmCacheSession.getRealmDelegate(RealmCacheSession.java:149) ~[keycloak-model-infinispan-18.0.0.jar!/:18.0.0]
        at org.keycloak.models.cache.infinispan.RealmCacheSession.getRealmByName(RealmCacheSession.java:450) ~[keycloak-model-infinispan-18.0.0.jar!/:18.0.0]
        at org.keycloak.services.managers.ApplianceBootstrap.isNewInstall(ApplianceBootstrap.java:46) ~[keycloak-services-18.0.0.jar!/:18.0.0]
        at org.keycloak.services.resources.KeycloakApplication$3.run(KeycloakApplication.java:197) ~[keycloak-services-18.0.0.jar!/:18.0.0]
        at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:242) ~[keycloak-server-spi-private-18.0.0.jar!/:18.0.0]
        at org.keycloak.services.resources.KeycloakApplication.bootstrap(KeycloakApplication.java:174) ~[keycloak-services-18.0.0.jar!/:18.0.0]
        at com.github.thomasdarimont.keycloak.embedded.EmbeddedKeycloakApplication.bootstrap(EmbeddedKeycloakApplication.java:35) ~[embedded-keycloak-server-spring-boot-support-7.0.2.jar!/:7.0.2]

Note*** keycloak-model-jpa-18.0.0.jar is IN the jar file.

Database upgrade question

Hi,

We're currently using version 2.0.0 of embedded-spring-boot-keycloak-server (Keycloak 10) on PostgreSQL and we want to upgrade the database to try out the latest official Keycloak distribution (15).

When launching Keycloak 15, configured to use our Keycloak 10 database, we get the following exception:

09:44:00,550 INFO  [org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory] (ServerService Thread Pool -- 61) Database info: {databaseUrl=jdbc:postgresql://localhost/kcloakdb, databaseUser=kcloak, databaseProduct=PostgreSQL 11.1, databaseDriver=PostgreSQL JDBC Driver 42.2.23}
09:44:03,486 FATAL [org.keycloak.services] (ServerService Thread Pool -- 61) Error during startup: java.lang.RuntimeException: Exception invoking method [listUnrunChangeSets] on object [liquibase.Liquibase@7c5fb890], using arguments [null,(),false]
	at org.keycloak.common.util.reflections.Reflections.invokeMethod(Reflections.java:386)
	at org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider.getLiquibaseUnrunChangeSets(LiquibaseJpaUpdaterProvider.java:288)
	at org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider.validateChangeSet(LiquibaseJpaUpdaterProvider.java:254)
	at org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider.validate(LiquibaseJpaUpdaterProvider.java:227)
	at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.migration(DefaultJpaConnectionProviderFactory.java:315)
	at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.lambda$lazyInit$0(DefaultJpaConnectionProviderFactory.java:184)
	at org.keycloak.models.utils.KeycloakModelUtils.suspendJtaTransaction(KeycloakModelUtils.java:758)
	at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.lazyInit(DefaultJpaConnectionProviderFactory.java:135)
	at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.create(DefaultJpaConnectionProviderFactory.java:83)
	at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.create(DefaultJpaConnectionProviderFactory.java:61)
	at org.keycloak.services.DefaultKeycloakSession.getProvider(DefaultKeycloakSession.java:316)
	at org.keycloak.models.jpa.JpaRealmProviderFactory.create(JpaRealmProviderFactory.java:63)
	at org.keycloak.models.jpa.JpaRealmProviderFactory.create(JpaRealmProviderFactory.java:39)
	at org.keycloak.services.DefaultKeycloakSession.getProvider(DefaultKeycloakSession.java:316)
	at org.keycloak.services.DefaultKeycloakSession.realmLocalStorage(DefaultKeycloakSession.java:228)
	at org.keycloak.models.cache.infinispan.RealmCacheSession.getRealmDelegate(RealmCacheSession.java:149)
	at org.keycloak.models.cache.infinispan.RealmCacheSession.getRealm(RealmCacheSession.java:411)
	at org.keycloak.services.managers.ApplianceBootstrap.isNewInstall(ApplianceBootstrap.java:46)
	at org.keycloak.services.resources.KeycloakApplication$3.run(KeycloakApplication.java:195)
	at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:250)
	at org.keycloak.services.resources.KeycloakApplication.bootstrap(KeycloakApplication.java:172)
	at org.keycloak.services.resources.KeycloakApplication$1.run(KeycloakApplication.java:136)
	at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:250)
	at org.keycloak.services.resources.KeycloakApplication.startup(KeycloakApplication.java:128)
	at org.keycloak.provider.wildfly.WildflyPlatform.onStartup(WildflyPlatform.java:36)
	at org.keycloak.services.resources.KeycloakApplication.<init>(KeycloakApplication.java:114)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:152)
	at org.jboss.resteasy.spi.ResteasyProviderFactory.createProviderInstance(ResteasyProviderFactory.java:2835)
	at org.jboss.resteasy.spi.ResteasyDeployment.createApplication(ResteasyDeployment.java:376)
	at org.jboss.resteasy.spi.ResteasyDeployment.startInternal(ResteasyDeployment.java:288)
	at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:98)
	at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:140)
	at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:42)
	at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117)
	at org.wildfly.extension.undertow.security.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:78)
	at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:103)
	at io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:305)
	at io.undertow.servlet.core.ManagedServlet.createServlet(ManagedServlet.java:145)
	at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:588)
	at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:559)
	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
	at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:601)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:97)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:78)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
	at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
	at java.lang.Thread.run(Thread.java:748)
	at org.jboss.threads.JBossThread.run(JBossThread.java:513)
Caused by: liquibase.exception.ValidationFailedException: Validation Failed:
     83 change sets check sum
          META-INF/jpa-changelog-1.0.0.Final.xml::1.0.0.Final-KEYCLOAK-5461::[email protected] was: 8:bda77d94bf90182a1e30c24f1c155ec7 but is now: 7:4e70412f24a3f382c82183742ec79317
          META-INF/db2-jpa-changelog-1.0.0.Final.xml::1.0.0.Final-KEYCLOAK-5461::[email protected] was: 8:1ecb330f30986693d1cba9ab579fa219 but is now: 7:cb16724583e9675711801c6875114f28
          META-INF/jpa-changelog-1.1.0.Beta1.xml::1.1.0.Beta1::[email protected] was: 8:cb7ace19bc6d959f305605d255d4c843 but is now: 7:0310eb8ba07cec616460794d42ade0fa
          META-INF/jpa-changelog-1.1.0.Final.xml::1.1.0.Final::[email protected] was: 8:80230013e961310e6872e871be424a63 but is now: 7:5d25857e708c3233ef4439df1f93f012
          META-INF/jpa-changelog-1.2.0.Beta1.xml::1.2.0.Beta1::[email protected] was: 8:67f4c20929126adc0c8e9bf48279d244 but is now: 7:c7a54a1041d58eb3817a4a883b4d4e84
          META-INF/db2-jpa-changelog-1.2.0.Beta1.xml::1.2.0.Beta1::[email protected] was: 8:7311018b0b8179ce14628ab412bb6783 but is now: 7:2e01012df20974c1c2a605ef8afe25b7
          META-INF/jpa-changelog-1.2.0.CR1.xml::1.2.0.RC1::[email protected] was: 8:037ba1216c3640f8785ee6b8e7c8e3c1 but is now: 7:0f08df48468428e0f30ee59a8ec01a41
          META-INF/db2-jpa-changelog-1.2.0.CR1.xml::1.2.0.RC1::[email protected] was: 8:7fe6ffe4af4df289b3157de32c624263 but is now: 7:a77ea2ad226b345e7d689d366f185c8c
          META-INF/jpa-changelog-1.2.0.Final.xml::1.2.0.Final::keycloak was: 8:9c136bc3187083a98745c7d03bc8a303 but is now: 7:a3377a2059aefbf3b90ebb4c4cc8e2ab
          META-INF/jpa-changelog-1.3.0.xml::1.3.0::[email protected] was: 8:b5f09474dca81fb56a97cf5b6553d331 but is now: 7:04c1dbedc2aa3e9756d1a1668e003451
          META-INF/jpa-changelog-1.4.0.xml::1.4.0::[email protected] was: 8:ca924f31bd2a3b219fdcfe78c82dacf4 but is now: 7:36ef39ed560ad07062d956db861042ba
          META-INF/db2-jpa-changelog-1.4.0.xml::1.4.0::[email protected] was: 8:8acad7483e106416bcfa6f3b824a16cd but is now: 7:d909180b2530479a716d3f9c9eaea3d7
          META-INF/jpa-changelog-1.5.0.xml::1.5.0::[email protected] was: 8:9b1266d17f4f87c78226f5055408fd5e but is now: 7:cf12b04b79bea5152f165eb41f3955f6
          META-INF/jpa-changelog-1.6.1.xml::1.6.1_from15::[email protected] was: 8:d80ec4ab6dbfe573550ff72396c7e910 but is now: 7:7e32c8f05c755e8675764e7d5f514509
          META-INF/jpa-changelog-1.6.1.xml::1.6.1_from16-pre::[email protected] was: 8:d86eb172171e7c20b9c849b584d147b2 but is now: 7:980ba23cc0ec39cab731ce903dd01291
          META-INF/jpa-changelog-1.6.1.xml::1.6.1_from16::[email protected] was: 8:5735f46f0fa60689deb0ecdc2a0dea22 but is now: 7:2fa220758991285312eb84f3b4ff5336
          META-INF/jpa-changelog-1.6.1.xml::1.6.1::[email protected] was: 8:d41d8cd98f00b204e9800998ecf8427e but is now: 7:d41d8cd98f00b204e9800998ecf8427e
          META-INF/jpa-changelog-1.7.0.xml::1.7.0::[email protected] was: 8:5c1a8fd2014ac7fc43b90a700f117b23 but is now: 7:91ace540896df890cc00a0490ee52bbc
          META-INF/jpa-changelog-1.8.0.xml::1.8.0::[email protected] was: 8:1f6c2c2dfc362aff4ed75b3f0ef6b331 but is now: 7:c31d1646dfa2618a9335c00e07f89f24
          META-INF/jpa-changelog-1.8.0.xml::1.8.0-2::keycloak was: 8:dee9246280915712591f83a127665107 but is now: 7:df8bc21027a4f7cbbb01f6344e89ce07
          META-INF/db2-jpa-changelog-1.8.0.xml::1.8.0::[email protected] was: 8:9eb2ee1fa8ad1c5e426421a6f8fdfa6a but is now: 7:f987971fe6b37d963bc95fee2b27f8df
          META-INF/db2-jpa-changelog-1.8.0.xml::1.8.0-2::keycloak was: 8:dee9246280915712591f83a127665107 but is now: 7:df8bc21027a4f7cbbb01f6344e89ce07
          META-INF/jpa-changelog-1.9.0.xml::1.9.0::[email protected] was: 8:d9fa18ffa355320395b86270680dd4fe but is now: 7:ed2dc7f799d19ac452cbcda56c929e47
          META-INF/jpa-changelog-1.9.1.xml::1.9.1::keycloak was: 8:90cff506fedb06141ffc1c71c4a1214c but is now: 7:80b5db88a5dda36ece5f235be8757615
          META-INF/db2-jpa-changelog-1.9.1.xml::1.9.1::keycloak was: 8:11a788aed4961d6d29c427c063af828c but is now: 7:1437310ed1305a9b93f8848f301726ce
          META-INF/jpa-changelog-1.9.2.xml::1.9.2::keycloak was: 8:a4218e51e1faf380518cce2af5d39b43 but is now: 7:b82ffb34850fa0836be16deefc6a87c4

	at liquibase.changelog.DatabaseChangeLog.validate(DatabaseChangeLog.java:266)
	at liquibase.Liquibase.listUnrunChangeSets(Liquibase.java:1189)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.keycloak.common.util.reflections.Reflections.invokeMethod(Reflections.java:380)
	... 61 more

09:44:03,505 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 61) RESTEASY002225: Deploying javax.ws.rs.core.Application: class org.keycloak.services.resources.KeycloakApplication

The questions are:

  • The database upgrade should work, correct? The database used by this project should be compatible with Keycloak's, right?
    ** We also tried running our database on the official Keycloak 10 and got the same result.
  • Can anyone point us to a good resource on configuring Keycloak to run Postgres, or how to troubleshoot this kind of problems?
    ** I find it odd that the stack traces seem to refer to DB2 (db2-jpa-changelog) instead of Postgres

Fix LDAP User Federation

Currently the LDAP User Federation does not work.

The LDAPContext factory creation fails with:

javax.naming.NotContextException: Not an instance of DirContext
at java.naming/javax.naming.directory.InitialDirContext.getURLOrDefaultInitDirCtx(InitialDirContext.java:154) ~[na:na]
at java.naming/javax.naming.directory.InitialDirContext.search(InitialDirContext.java:305) ~[na:na]
at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager$3.execute(LDAPOperationManager.java:252) ~[keycloak-ldap-federation-10.0.0.jar:10.0.0]
at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager$3.execute(LDAPOperationManager.java:249) ~[keycloak-ldap-federation-10.0.0.jar:10.0.0]
at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.execute(LDAPOperationManager.java:698) ~[keycloak-ldap-federation-10.0.0.jar:10.0.0]
at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.execute(LDAPOperationManager.java:678) ~[keycloak-ldap-federation-10.0.0.jar:10.0.0]
at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.execute(LDAPOperationManager.java:673) ~[keycloak-ldap-federation-10.0.0.jar:10.0.0]
at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.search(LDAPOperationManager.java:249) ~[keycloak-ldap-federation-10.0.0.jar:10.0.0]
at org.keycloak.storage.ldap.idm.store.ldap.LDAPIdentityStore.fetchQueryResults(LDAPIdentityStore.java:280) ~[keycloak-ldap-federation-10.0.0.jar:10.0.0]
at org.keycloak.storage.ldap.idm.query.internal.LDAPQuery.getResultList(LDAPQuery.java:174) ~[keycloak-ldap-federation-10.0.0.jar:10.0.0]
at org.keycloak.storage.ldap.idm.query.internal.LDAPQuery.getFirstResult(LDAPQuery.java:185) ~[keycloak-ldap-federation-10.0.0.jar:10.0.0]
at org.keycloak.storage.ldap.LDAPStorageProvider.loadLDAPUserByUsername(LDAPStorageProvider.java:785) ~[keycloak-ldap-federation-10.0.0.jar:10.0.0]
at org.keycloak.storage.ldap.LDAPStorageProvider.getUserByUsername(LDAPStorageProvider.java:494) ~[keycloak-ldap-federation-10.0.0.jar:10.0.0]
at org.keycloak.storage.UserStorageManager.getUserByUsername(UserStorageManager.java:405) ~[keycloak-services-10.0.0.jar:10.0.0]
at org.keycloak.models.cache.infinispan.UserCacheSession.getUserByUsername(UserCacheSession.java:257) ~[keycloak-model-infinispan-10.0.0.jar:10.0.0]
at org.keycloak.services.resources.admin.UsersResource.createUser(UsersResource.java:121) ~[keycloak-services-10.0.0.jar:10.0.0]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]

default import of theme folder is disabled?

In this commit fada0db the enabled property of the theme config is set to false by default.
Is this correct?

When upgrading I noticed this default behaviour and it caught us off guard.
I was just curious for the reason behind this default, is it a security consideration?

Beginner question: how to deploy the keycloak authenticator example?

Hi,

The title says it all: I want to try the keycloak authenticator example but I am not sure how to deploy it to this keycloak.

The authenticator instructions say keycloak must be running and I only need to mvn clean install wildfly:deploy but that command fails with error java.net.ConnectException: WFLYPRT0053: Could not connect to remote+http://localhost:9990

Publish to maven central

Hi Thomas,

Could you please publish the modules intended to be reused (embedded-keycloak-server-spring-boot-support, embedded-keycloak-server-spring-boot-starter and the spring-boot-starter-parent as far as I can see) to maven central so that they can be reused by third party projects without the need to build them from source?

The README could then need an update about how to use this in a consuming project, which I'd be glad to contribute :-) [edit: done, see #20]

Best regards,
Mike

Error Pages are displayed incorrectly

Given the link (any other works as well) - this is on a fresh install on the latest master branch:

http://localhost:8080/auth/realms/master/login-actions/action-token?key=eyJhbGciOiJIUzI1NiIsInR5c

will result in an error page with HTML not being rendered properly:
image

Do you happen to have a clue where I should dig in? Might be a clash between error handling of the Keycloak part and Spring Boot?

The log output only consists of keycloak event log:

2020-05-14 18:04:48.331  WARN 50364 --- [  XNIO-1 task-3] org.keycloak.events                      : type=EXECUTE_ACTION_TOKEN_ERROR, realmId=master, clientId=null, userId=608a2672-d664-4f09-a11c-f6273bc21f41, ipAddress=0:0:0:0:0:0:0:1, error=not_allowed, reason='Key not found', token_id=a4d42acc-fad1-4334-8b01-8511b02b14cc, action=execute-actions

Issues with Kotlin and Beans

Sorry for the lack of a better title but I found very weird behavior when trying to include the embedded-keycloak-server dependency in a Kotlin Spring Boot project.
I created a very barebone project where it's reproducible:

https://github.com/jonasbark/embedded-keycloak-server-kotlin-issue

The issue:

Parameter 0 of constructor in pass.PassAuthenticationApplication required a bean of type 'pass.test.KotlinBean' that could not be found.

When removing the dependency from line 36 in build.gradle.kts it starts up just fine so I'm super confused as to why.

Observations:

  • if the KotlinBean is written in Java it works without issue (hence including Kotlin in the issue title)
  • happens with maven projects as well. The issue actually popped up after I tried upgrading to 3.0.1 from 2.0.* and suddenly the beans weren't available anymore

Let me know if I can provide more information!

Remove need for reflection in SpringBootPlatformProvider

We can remove the getPlatformField workaround in SpringBootPlatform pushing the SmartApplicationListener to the Delegate and registering it as a Bean thus registering as an ApplicationListener:

@Configuration
public class EmbeddedKeycloakConfig {

        @Bean
        @ConditionalOnMissingBean
        SpringBootPlatformProvider springBootPlatformProvider() {
            return (SpringBootPlatformProvider) Platform.getPlatform();
        }
@AutoService(PlatformProvider.class)
@Log4j2
public class SpringBootPlatformProvider implements PlatformProvider, SmartApplicationListener {

    Runnable onStartup;

    Runnable onShutdown;

    @Override
    public void onApplicationEvent(final ApplicationEvent event) {

        if (event instanceof ApplicationReadyEvent) {
            startup();
        }else if (event instanceof ContextStoppedEvent) {
            shutdown();
        }
    }

    @Override
    public boolean supportsEventType(final Class<? extends ApplicationEvent> eventType) {
        return ApplicationReadyEvent.class.equals(eventType) || ContextStoppedEvent.class.equals(eventType);
    }

    @Override
    public String getListenerId() {
        return this.getClass()
                .getName();
    }

    @Override
    public void onStartup(@SuppressWarnings("hiding") final Runnable onStartup) {
        this.onStartup = onStartup;
    }

    @Override
    public void onShutdown(@SuppressWarnings("hiding") final Runnable onShutdown) {
        this.onShutdown = onShutdown;
    }

    @Override
    public void exit(final Throwable cause) {

        LOGGER.error("exit", cause);
        ServicesLogger.LOGGER.fatal(cause);
        throw new RuntimeException(cause);
    }

    private void shutdown() {
        this.onShutdown.run();

    }

    private void startup() {
        this.onStartup.run();

    }
}

Unable to add new user

Hey,
I cloned the project and tried to play with the embedded server.

Error:

Through the console, I can create new realm, roles and groups just fine, but when I try to add new user, an error occurs - updateReadOnlyAttributesRejectedMessage.
Error log:
2021-10-27 10:53:35.970 WARN 10896 --- [ XNIO-1 task-2] .u.v.ReadOnlyAttributeUnchangedValidator : Attempt to edit denied attribute '(?i:)' of user 'new user'
I tried to debug the source of the problem in class ReadOnlyAttributeUnchangedValidator and it treats the field as readonly, even though I just try to add new user.

Alternative ways to add new user:

  • admin-console - fails as I mentioned above
  • rest-api - fails with the same error
  • import realm with users - succeed, but can't update user's details because of the same error above

I also tried to search for related configuration regarding read-only users and didn't manage to find something.

Reproduce:

  • Run the plain/custom embedded Keycloak server
  • Enter admin console
  • Create new realm
  • Try to add user with some username

Versions:

I checked versions 5.0.1, 5.0.2, 5.0.3 and the error occurs in all of them.
I checked against Keycloak 15.0.2 on docker - adding new user succeeds just fine.

Add default keycloak configuration

To ease the usage of the starter we should ship with a set of reasonable default configuration for Keycloak.

Tasks:

  • Include a default keycloak configuration
  • If no admin user password is configured, generate a random password and print it to the console like spring security does.

A default keycloak configuration could look like this:

keycloak:
  hostname:
    provider: "default"
    default:
      frontendUrl: ""
      adminUrl: ""
      forceBackendUrlToFrontendUrl: false

  admin:
    realm: "master"

  eventsStore:
    provider: "jpa"

  eventsListener:
    "jboss-logging":
      "success-level": "info"
      "error-level": "warn"

  realm:
    provider: "jpa"

  user:
    provider: "jpa"

  userFederatedStorage:
    provider: "jpa"

  userSessionPersister:
    provider: "jpa"

  authorizationPersister:
    provider: "jpa"

  userCache:
    default:
      enabled: true

  timer:
    provider: "basic"

  theme:
    staticMaxAge: "2592000"
    cacheTemplates: true
    cacheThemes: true
    folder:
      dir: ""

  scheduled:
    interval: 900

  connectionsHttpClient:
    default: {}

  connectionsJpa:
    provider: "default"
    default:
      dataSource: "spring/datasource"
      initializeEmpty: true
      migrationStrategy: "update"
      showSql: false
      formatSql: true
      globalStatsInterval: -1

  realmCache:
    default:
      enabled: true

  connectionsInfinispan:
    default:
      jgroupsUdpMcastAddr: "234.56.78.90"
      nodeName: "localhost"
      siteName: ""
      clustered: fase
      async: false
      sessionsOwners: 1
      l1Lifespan: 600000
      remoteStoreEnabled: false
      remoteStoreHost: "localhost"
      remoteStorePort: 11222
      hotrodProtocolVersion: ""

  scripting: {}

  "jta-lookup":
    provider: "jboss"
    jboss:
      enabled: true

  "login-protocol":
    "saml":
      "knownProtocols": ["http=${server.port}", "https=${server.port}"]

  "x509cert-lookup":
    provider: "default"
    default:
      enabled: true

      haproxy:
        enabled: true
        sslClientCert: "x-ssl-client-cert"
        sslCertChainPrefix: "x-ssl-client-cert-chain"
        certificateChainLength: 1

      apache:
        enabled: true
        sslClientCert: "x-ssl-client-cert"
        sslCertChainPrefix: "x-ssl-client-cert-chain"
        certificateChainLength: 1

      nginx:
        enabled: true
        sslClientCert: "x-ssl-client-cert"
        sslCertChainPrefix: "x-ssl-client-cert-chain"
        certificateChainLength: 1

Could not find unique implementation of liquibase.executor.Executor. Found 0 implementations

Has anyone encountered this error before?

It works when I run it from IntelliJ but not when I try to run it from docker. The same result while trying to run the jar file manually from the command line.

Any help would be greatly appreciated. Thanks ♥️

liquibase.exception.UnexpectedLiquibaseException: liquibase.exception.UnexpectedLiquibaseException: liquibase.exception.UnexpectedLiquibaseException: liquibase.exception.UnexpectedLiquibaseException: liquibase.exception.ServiceNotFoundException: liquibase.exception.ServiceNotFoundException: Could not find unique implementation of liquibase.executor.Executor.  Found 0 implementations
        at liquibase.change.ChangeFactory.register(ChangeFactory.java:87) ~[liquibase-core-3.6.3.jar!/:na]
        at org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider.baseLiquibaseInitialization(DefaultLiquibaseConnectionProvider.java:128) ~[keycloak-model-jpa-15.0.2.jar!/:15.0.2]
        at org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider.create(DefaultLiquibaseConnectionProvider.java:75) ~[keycloak-model-jpa-15.0.2.jar!/:15.0.2]
        at org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider.create(DefaultLiquibaseConnectionProvider.java:57) ~[keycloak-model-jpa-15.0.2.jar!/:15.0.2]
        at org.keycloak.services.DefaultKeycloakSession.getProvider(DefaultKeycloakSession.java:316) ~[keycloak-services-15.0.2.jar!/:15.0.2]
        at org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.lazyInit(LiquibaseDBLockProvider.java:62) ~[keycloak-model-jpa-15.0.2.jar!/:15.0.2]
        at org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.lambda$waitForLock$2(LiquibaseDBLockProvider.java:96) ~[keycloak-model-jpa-15.0.2.jar!/:15.0.2]
        at org.keycloak.models.utils.KeycloakModelUtils.suspendJtaTransaction(KeycloakModelUtils.java:758) ~[keycloak-server-spi-private-15.0.2.jar!/:15.0.2]
        at org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.waitForLock(LiquibaseDBLockProvider.java:94) ~[keycloak-model-jpa-15.0.2.jar!/:15.0.2]
        at org.keycloak.services.resources.KeycloakApplication$1.run(KeycloakApplication.java:134) ~[keycloak-services-15.0.2.jar!/:15.0.2]
        at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:250) ~[keycloak-server-spi-private-15.0.2.jar!/:15.0.2]
        at org.keycloak.services.resources.KeycloakApplication.startup(KeycloakApplication.java:128) ~[keycloak-services-15.0.2.jar!/:15.0.2]
        at com.github.thomasdarimont.keycloak.embedded.support.SpringBootPlatformProvider.startup(SpringBootPlatformProvider.java:72) ~[embedded-keycloak-server-spring-boot-support-5.0.2.jar!/:5.0.2]
        at com.github.thomasdarimont.keycloak.embedded.support.SpringBootPlatformProvider.onApplicationEvent(SpringBootPlatformProvider.java:28) ~[embedded-keycloak-server-spring-boot-support-5.0.2.jar!/:5.0.2]
        at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) ~[spring-context-5.3.9.jar!/:5.3.9]
        at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) ~[spring-context-5.3.9.jar!/:5.3.9]
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) ~[spring-context-5.3.9.jar!/:5.3.9]
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421) ~[spring-context-5.3.9.jar!/:5.3.9]
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378) ~[spring-context-5.3.9.jar!/:5.3.9]
        at org.springframework.boot.context.event.EventPublishingRunListener.running(EventPublishingRunListener.java:111) ~[spring-boot-2.5.4.jar!/:2.5.4]
        at org.springframework.boot.SpringApplicationRunListeners.lambda$running$6(SpringApplicationRunListeners.java:79) ~[spring-boot-2.5.4.jar!/:2.5.4]
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na]
        at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:117) ~[spring-boot-2.5.4.jar!/:2.5.4]
        at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:111) ~[spring-boot-2.5.4.jar!/:2.5.4]
        at org.springframework.boot.SpringApplicationRunListeners.running(SpringApplicationRunListeners.java:79) ~[spring-boot-2.5.4.jar!/:2.5.4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:353) ~[spring-boot-2.5.4.jar!/:2.5.4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2.5.4.jar!/:2.5.4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2.5.4.jar!/:2.5.4]
        at com.ninexlabs.mlmpro.authservice.AuthServerApplication.main(AuthServerApplication.java:14) ~[classes!/:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[auth-service.jar:na]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) ~[auth-service.jar:na]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[auth-service.jar:na]
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) ~[auth-service.jar:na]
Caused by: liquibase.exception.UnexpectedLiquibaseException: liquibase.exception.UnexpectedLiquibaseException: liquibase.exception.UnexpectedLiquibaseException: liquibase.exception.ServiceNotFoundException: liquibase.exception.ServiceNotFoundException: Could not find unique implementation of liquibase.executor.Executor.  Found 0 implementations
        at liquibase.change.AbstractChange.createChangeMetaData(AbstractChange.java:98) ~[liquibase-core-3.6.3.jar!/:na]
        at liquibase.change.ChangeFactory.getChangeMetaData(ChangeFactory.java:101) ~[liquibase-core-3.6.3.jar!/:na]
        at liquibase.change.ChangeFactory.register(ChangeFactory.java:71) ~[liquibase-core-3.6.3.jar!/:na]
        ... 36 common frames omitted
Caused by: liquibase.exception.UnexpectedLiquibaseException: liquibase.exception.UnexpectedLiquibaseException: liquibase.exception.ServiceNotFoundException: liquibase.exception.ServiceNotFoundException: Could not find unique implementation of liquibase.executor.Executor.  Found 0 implementations
        at liquibase.change.AbstractChange.createChangeParameterMetadata(AbstractChange.java:151) ~[liquibase-core-3.6.3.jar!/:na]
        at liquibase.change.AbstractChange.createChangeMetaData(AbstractChange.java:84) ~[liquibase-core-3.6.3.jar!/:na]
        ... 38 common frames omitted
Caused by: liquibase.exception.UnexpectedLiquibaseException: liquibase.exception.ServiceNotFoundException: liquibase.exception.ServiceNotFoundException: Could not find unique implementation of liquibase.executor.Executor.  Found 0 implementations
        at liquibase.executor.ExecutorService.getExecutor(ExecutorService.java:30) ~[liquibase-core-3.6.3.jar!/:na]
        at org.keycloak.connections.jpa.updater.liquibase.custom.CustomCreateIndexChange.generateStatements(CustomCreateIndexChange.java:60) ~[keycloak-model-jpa-15.0.2.jar!/:15.0.2]
        at liquibase.change.AbstractChange.supports(AbstractChange.java:334) ~[liquibase-core-3.6.3.jar!/:na]
        at liquibase.change.ChangeParameterMetaData.analyzeSupportedDatabases(ChangeParameterMetaData.java:105) ~[liquibase-core-3.6.3.jar!/:na]
        at liquibase.change.ChangeParameterMetaData.<init>(ChangeParameterMetaData.java:87) ~[liquibase-core-3.6.3.jar!/:na]
        at liquibase.change.AbstractChange.createChangeParameterMetadata(AbstractChange.java:148) ~[liquibase-core-3.6.3.jar!/:na]
        ... 39 common frames omitted
Caused by: liquibase.exception.ServiceNotFoundException: liquibase.exception.ServiceNotFoundException: Could not find unique implementation of liquibase.executor.Executor.  Found 0 implementations
        at liquibase.servicelocator.ServiceLocator.newInstance(ServiceLocator.java:216) ~[liquibase-core-3.6.3.jar!/:na]
        at liquibase.executor.ExecutorService.getExecutor(ExecutorService.java:26) ~[liquibase-core-3.6.3.jar!/:na]
        ... 44 common frames omitted
Caused by: liquibase.exception.ServiceNotFoundException: Could not find unique implementation of liquibase.executor.Executor.  Found 0 implementations
        at liquibase.servicelocator.ServiceLocator.findClass(ServiceLocator.java:188) ~[liquibase-core-3.6.3.jar!/:na]
        at liquibase.servicelocator.ServiceLocator.newInstance(ServiceLocator.java:214) ~[liquibase-core-3.6.3.jar!/:na]
        ... 45 common frames omitted

Theme Resources are not loaded

The embedded spring boot keycloak server seems not to be able to load theme resources out of the box. I was trying to include this identity provider extension:

https://github.com/BenjaminFavre/keycloak-apple-social-identity-provider

In its documentation, it is referring to the Keycloak Deployer, which we don't have in this project's context (I guess?). So I just included the provider Jar in the classpath (Spring-Boot style). The provider showed up in the admin console's list of identity providers but when I chose it, I got a 404 error indicating a missing resource. Diving into the provider's code showed that some html files located in theme-resources/resources/partials/ should have been accessible but actually aren't.

After I found the corresponding part of the Keycloak documentation, I wrote a quick and dirty ThemeResourceProvider that would just look up the resource in the classpath underneath the documented theme-resources/resources/ prefix and voila: it worked for the html files.

The identity provider still seems to be missing its message resources though, but there's no such thing as a MessageResourceProvider so I don't think I can monkey-patch that one in.

TL;DR: the mechanism that loads theme resources (resources, messages and probably also templates) described here doesn't seem to work in the embedded spring boot keycloak server.

How to import keycloak-scripts.json?

Hello,

I'm trying to import a META-INF/keycloak-scripts.json using this embedded server and it's not working.

After some trying, I was able to import using keycloak official docker images.

I'm imagining the issue is that this project doesn't use WildFly and looks like this import is done by WildFly? (ScriptProviderDeploymentProcessor/KeycloakProviderDeploymentProcessor)

Beginner Question: How to add configuration to use it behind an Load-Balancer

Hi,

I´m trying to run the keycloak server on AWS - ElasticBeanstalk (ELB) in a VPC with a Load-Balancer and NAT-Gateway in front.
So SSL-Cert is on the Domain, but not on the ELB-Instance with the keycloak-server.

When I try to login to the admin-console I have the problem, that the auth-server-url is a regular http-request and not a https.

I found a possible solution, but I don´t know where to do these configuration in the project:
" ... make sure that you have set "proxy-address-forwarding=true" in your standalone.xml configuration of Wildfly."

Thank you in advance for every help / advice,
Christian.

Need to fix JNDI lookup for executor service

org.keycloak.executors.DefaultExecutorsProviderFactory has logic :
protected void detectManaged() { String jndiName = MANAGED_EXECUTORS_SERVICE_JNDI_PREFIX + "default"; try { new InitialContext().lookup(jndiName); logger.debugf("We are in managed environment. Executor '%s' was available.", jndiName); managed = true; } catch (NamingException nnfe) { logger.debugf("We are not in managed environment. Executor '%s' was not available.", jndiName); managed = false; } }

means to work with managed executor 'java:jboss/ee/concurrency/executor/default' should be present in context.
So, I think you should first register 'java:jboss/ee/concurrency/executor/default' then "java:jboss/ee/concurrency/executor/default/storage-provider-threads" inside your DynamicJndiContextFactoryBuilder.java.

Also, the lookup method should throw 'NameNotFoundException' inside KeycloakInitialContext.java so as to fallback on default executor if the executor for given taskType not found.

@see
org.keycloak.executors.DefaultExecutorsProviderFactory:
protected ExecutorService getPoolManaged(String taskType, KeycloakSession session)

Could not find keycloak import file

I see a message in the log file:
2020-05-20 08:34:43.581 INFO 4056 --- [ main] c.g.t.k.e.EmbeddedKeycloakApplication : Could not find keycloak import file ServletContext resource [/keycloak-realm-config.json]

The realm file is declared in application.yml of embedded-keycloak-server-plain module. But there is no such a file in sources.

Maven not finding version 5

I tried rebuilding my project with 5.0.0 but it wasn't finding it. All earlier versions work fine. Is there time needed before it become available via Jitpack?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.