Skip to content

Commit cd8e5fa

Browse files
authored
Merge pull request #11500 from IQSS/679-spi-multidatasource-setup
Parametrized datasource in Keycloak SPI
2 parents 7797862 + 272d488 commit cd8e5fa

File tree

6 files changed

+53
-11
lines changed

6 files changed

+53
-11
lines changed

conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/providers/DataverseUserStorageProvider.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ public class DataverseUserStorageProvider implements
3131
public DataverseUserStorageProvider(KeycloakSession session, ComponentModel model) {
3232
this.session = session;
3333
this.model = model;
34-
this.dataverseUserService = new DataverseUserService(session);
34+
35+
String datasource = model.getConfig().getFirst("datasource");
36+
logger.debugf("Using datasource: %s", datasource);
37+
this.dataverseUserService = new DataverseUserService(session, datasource);
3538
}
3639

3740
@Override

conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/providers/DataverseUserStorageProviderFactory.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
import org.jboss.logging.Logger;
44
import org.keycloak.component.ComponentModel;
55
import org.keycloak.models.KeycloakSession;
6+
import org.keycloak.provider.ProviderConfigProperty;
67
import org.keycloak.storage.UserStorageProviderFactory;
78

9+
import java.util.ArrayList;
10+
import java.util.List;
11+
812
public class DataverseUserStorageProviderFactory implements UserStorageProviderFactory<DataverseUserStorageProvider> {
913

1014
public static final String PROVIDER_ID = "dv-builtin-users-authenticator";
@@ -30,4 +34,19 @@ public String getHelpText() {
3034
public void close() {
3135
logger.debug("<<<<<< Closing factory");
3236
}
37+
38+
@Override
39+
public List<ProviderConfigProperty> getConfigProperties() {
40+
List<ProviderConfigProperty> configProperties = new ArrayList<>();
41+
42+
ProviderConfigProperty mySetting = new ProviderConfigProperty();
43+
mySetting.setName("datasource");
44+
mySetting.setLabel("Datasource");
45+
mySetting.setHelpText("This specifies the target datasource used by the SPI.");
46+
mySetting.setType(ProviderConfigProperty.STRING_TYPE);
47+
48+
configProperties.add(mySetting);
49+
50+
return configProperties;
51+
}
3352
}

conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/services/DataverseUserService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ public class DataverseUserService {
1717

1818
private final EntityManager em;
1919

20-
public DataverseUserService(KeycloakSession session) {
21-
this.em = session.getProvider(JpaConnectionProvider.class, "user-store").getEntityManager();
20+
public DataverseUserService(KeycloakSession session, String datasource) {
21+
this.em = session.getProvider(JpaConnectionProvider.class, datasource).getEntityManager();
2222
}
2323

2424
public DataverseUser getUserById(String id) {

conf/keycloak/builtin-users-spi/src/main/resources/META-INF/persistence.xml

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,26 @@
1313
<!-- JDBC connection settings -->
1414
<property name="hibernate.connection.datasource" value="user-store"/>
1515

16-
<!-- Database connection properties for PostgreSQL -->
17-
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
18-
<property name="hibernate.connection.url" value="jdbc:postgresql://postgres:5432/dataverse"/>
19-
<property name="hibernate.connection.username" value="${DATAVERSE_DB_USER}"/>
20-
<property name="hibernate.connection.password" value="secret"/>
16+
<!-- Transaction management settings -->
17+
<property name="jakarta.persistence.transactionType" value="JTA"/>
18+
19+
<!-- Automatically update database schema -->
20+
<property name="hibernate.hbm2ddl.auto" value="none"/>
21+
22+
<!-- Disable SQL logging -->
23+
<property name="hibernate.show_sql" value="false"/>
24+
</properties>
25+
</persistence-unit>
26+
27+
<persistence-unit name="user-store-qa" transaction-type="JTA">
28+
<class>edu.harvard.iq.keycloak.auth.spi.models.DataverseBuiltinUser</class>
29+
<class>edu.harvard.iq.keycloak.auth.spi.models.DataverseAuthenticatedUser</class>
30+
<properties>
31+
<!-- Set the Hibernate dialect for PostgreSQL -->
32+
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
33+
34+
<!-- JDBC connection settings -->
35+
<property name="hibernate.connection.datasource" value="user-store-qa"/>
2136

2237
<!-- Transaction management settings -->
2338
<property name="jakarta.persistence.transactionType" value="JTA"/>

conf/keycloak/builtin-users-spi/src/test/java/edu/harvard/iq/keycloak/auth/spi/services/DataverseUserServiceTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
class DataverseUserServiceTest {
2020

21+
private static final String TEST_USER_STORE = "user-store";
22+
2123
private EntityManager entityManagerMock;
2224
private DataverseUserService sut;
2325

@@ -27,10 +29,10 @@ void setUp() {
2729
KeycloakSession sessionMock = mock(KeycloakSession.class);
2830

2931
JpaConnectionProvider jpaConnectionProviderMock = mock(JpaConnectionProvider.class);
30-
when(sessionMock.getProvider(JpaConnectionProvider.class, "user-store")).thenReturn(jpaConnectionProviderMock);
32+
when(sessionMock.getProvider(JpaConnectionProvider.class, TEST_USER_STORE)).thenReturn(jpaConnectionProviderMock);
3133
when(jpaConnectionProviderMock.getEntityManager()).thenReturn(entityManagerMock);
3234

33-
sut = new DataverseUserService(sessionMock);
35+
sut = new DataverseUserService(sessionMock, TEST_USER_STORE);
3436
}
3537

3638
@Test

conf/keycloak/setup-spi.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ curl -X POST "http://keycloak:8090/admin/realms/test/components" \
3535
"name": "Dataverse built-in users authentication",
3636
"providerId": "dv-builtin-users-authenticator",
3737
"providerType": "org.keycloak.storage.UserStorageProvider",
38-
"parentId": null
38+
"parentId": null,
39+
"config": {
40+
"datasource": ["user-store"]
41+
}
3942
}'
4043

4144
echo "Keycloak SPI configured in realm."

0 commit comments

Comments
 (0)