Hey Steffen,
There are couple of ways to do it AFAIK.
What we did for our custom UserStorageProvider was to setup a datasource configuration in
the existing keycloak datatsources configuration.
In the <datasources> section of the standalone.xml you have to add following.
We are using an external Postgres DB so my config looks like:
<datasource jndi-name="java:jboss/datasources/yourDB"
pool-name="yourDB" enabled="true"
use-java-context="true">
<connection-url>jdbc:postgresql://<ip_or_host_of_your_external
DB>:5432/yourDB</connection-url>
<driver>postgresql</driver>
<security>
<user-name>postgres</user-name>
<password>postgres</password>
</security>
</datasource>
Then in the <drivers> section (when it is not already defined) you need to add the
driver you use. In my case it is Postgres:
<driver name="postgresql" module="org.postgresql.jdbc">
<xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
</driver>
In your custom UserStorageProviderFactory ideally in the constructor you can lookup for
the datasource:
public UserStorageProviderFactory() throws NamingException {
InitialContext context = new InitialContext();
dataSource = (DataSource) context.lookup("java:jboss/datasources/yourDB");
try {
log.info("datasource: " + dataSource.toString());
log.info("WORKING: " + dataSource.getConnection().isValid(3000));
} catch (SQLException e) {
e.printStackTrace();
}
}
In the create method of your custom factory you can pass the Connection object to your
UserStorageProvider:
public UserStorageProvider create(KeycloakSession keycloakSession, ComponentModel
componentModel) {
try {
return new UserStorageProvider(keycloakSession, componentModel,
dataSource.getConnection());
} catch (SQLException e) {
throw new RuntimeException("Could not get a connection for DB");
}
}
In your provider class you can use this connection to do the lookup for users etc. I hope
this helps.
Best,
Soner
Show replies by date