From db34307395fb8e647b56482b4dc953184c903c04 Mon Sep 17 00:00:00 2001 From: GPortas Date: Wed, 29 Jan 2025 20:22:34 +0100 Subject: [PATCH] Added: DataverseAuthenticatedUser for populating extra information in DataverseUserAdapter --- .../auth/spi/DataverseAuthenticatedUser.java | 36 ++++++++++++++++++ .../auth/spi/DataverseBuiltinUser.java | 23 +++++++++++ .../iq/keycloak/auth/spi/DataverseUser.java | 36 ------------------ .../auth/spi/DataverseUserAdapter.java | 29 ++++++++++---- .../spi/DataverseUserStorageProvider.java | 38 ++++++++++++++----- .../main/resources/META-INF/persistence.xml | 3 +- 6 files changed, 110 insertions(+), 55 deletions(-) create mode 100644 conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseAuthenticatedUser.java create mode 100644 conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseBuiltinUser.java delete mode 100644 conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseUser.java diff --git a/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseAuthenticatedUser.java b/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseAuthenticatedUser.java new file mode 100644 index 00000000000..1f886964cc2 --- /dev/null +++ b/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseAuthenticatedUser.java @@ -0,0 +1,36 @@ +package edu.harvard.iq.keycloak.auth.spi; + +import jakarta.persistence.*; + +@NamedQueries({ + @NamedQuery(name = "DataverseAuthenticatedUser.findByEmail", + query = "select au from DataverseAuthenticatedUser au WHERE LOWER(au.email)=LOWER(:email)"), + @NamedQuery(name = "DataverseAuthenticatedUser.findByIdentifier", + query = "select au from DataverseAuthenticatedUser au WHERE LOWER(au.userIdentifier)=LOWER(:identifier)"), +}) +@Entity +@Table(name = "authenticateduser") +public class DataverseAuthenticatedUser { + @Id + private String id; + private String email; + private String lastName; + private String firstName; + private String userIdentifier; + + public String getEmail() { + return email; + } + + public String getLastName() { + return lastName; + } + + public String getFirstName() { + return firstName; + } + + public String getUserIdentifier() { + return userIdentifier; + } +} diff --git a/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseBuiltinUser.java b/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseBuiltinUser.java new file mode 100644 index 00000000000..ea4c8496ab2 --- /dev/null +++ b/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseBuiltinUser.java @@ -0,0 +1,23 @@ +package edu.harvard.iq.keycloak.auth.spi; + +import jakarta.persistence.*; + +@NamedQueries({ + @NamedQuery(name = "DataverseUser.findByUsername", + query = "SELECT u FROM DataverseBuiltinUser u WHERE LOWER(u.username)=LOWER(:username)") +}) +@Entity +@Table(name = "builtinuser") +public class DataverseBuiltinUser { + @Id + private String id; + private String username; + + public String getId() { + return id; + } + + public String getUsername() { + return username; + } +} diff --git a/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseUser.java b/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseUser.java deleted file mode 100644 index f0a10ff4a53..00000000000 --- a/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseUser.java +++ /dev/null @@ -1,36 +0,0 @@ -package edu.harvard.iq.keycloak.auth.spi; - -import jakarta.persistence.*; - - -@NamedQueries({ - @NamedQuery(name = "DataverseUser.findAll", - query = "SELECT u FROM DataverseUser u"), - @NamedQuery(name = "DataverseUser.findByUsername", - query = "SELECT u FROM DataverseUser u WHERE LOWER(u.username)=LOWER(:username)") -}) -@Entity -@Table(name = "builtinuser") -public class DataverseUser { - @Id - private String id; - private String username; - private int passwordEncryptionVersion; - private String encryptedPassword; - - public String getId() { - return id; - } - - public String getUsername() { - return username; - } - - public String getEncryptedPassword() { - return encryptedPassword; - } - - public int getPasswordEncryptionVersion() { - return passwordEncryptionVersion; - } -} \ No newline at end of file diff --git a/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseUserAdapter.java b/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseUserAdapter.java index d244874193d..46838e37c6b 100644 --- a/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseUserAdapter.java +++ b/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseUserAdapter.java @@ -11,26 +11,39 @@ public class DataverseUserAdapter extends AbstractUserAdapterFederatedStorage { - protected DataverseUser user; + protected DataverseBuiltinUser builtinUser; + protected DataverseAuthenticatedUser authenticatedUser; protected String keycloakId; - public DataverseUserAdapter(KeycloakSession session, RealmModel realm, ComponentModel model, DataverseUser user) { + public DataverseUserAdapter(KeycloakSession session, RealmModel realm, ComponentModel model, DataverseBuiltinUser builtinUser, DataverseAuthenticatedUser authenticatedUser) { super(session, realm, model); - this.user = user; - keycloakId = StorageId.keycloakId(model, user.getId()); + this.builtinUser = builtinUser; + this.authenticatedUser = authenticatedUser; + keycloakId = StorageId.keycloakId(model, builtinUser.getId()); } - public String getEncryptedPassword() { - return user.getEncryptedPassword(); + @Override + public void setUsername(String s) { } + @Override public String getUsername() { - return user.getUsername(); + return builtinUser.getUsername(); } @Override - public void setUsername(String s) { + public String getEmail() { + return authenticatedUser.getEmail(); + } + @Override + public String getFirstName() { + return authenticatedUser.getFirstName(); + } + + @Override + public String getLastName() { + return authenticatedUser.getLastName(); } @Override diff --git a/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseUserStorageProvider.java b/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseUserStorageProvider.java index 35ad000716a..0096687c762 100644 --- a/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseUserStorageProvider.java +++ b/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/DataverseUserStorageProvider.java @@ -42,26 +42,34 @@ public class DataverseUserStorageProvider implements @Override public UserModel getUserById(RealmModel realmModel, String id) { logger.info("getUserById: " + id); - DataverseUser user = em.find(DataverseUser.class, id); + DataverseBuiltinUser user = em.find(DataverseBuiltinUser.class, id); if (user == null) { - logger.info("could not find user by id: " + id); + logger.info("could not find builtin user by id: " + id); return null; } - return new DataverseUserAdapter(session, realmModel, model, user); + String username = user.getUsername(); + DataverseAuthenticatedUser authenticatedUser = getAuthenticatedUserByUsername(username); + if (authenticatedUser == null) { + return null; + } + return new DataverseUserAdapter(session, realmModel, model, user, authenticatedUser); } @Override public UserModel getUserByUsername(RealmModel realmModel, String username) { logger.info("getUserByUsername: " + username); - TypedQuery query = em.createNamedQuery("DataverseUser.findByUsername", DataverseUser.class); + TypedQuery query = em.createNamedQuery("DataverseUser.findByUsername", DataverseBuiltinUser.class); query.setParameter("username", username); - List result = query.getResultList(); - if (result.isEmpty()) { + List builtinUsersResult = query.getResultList(); + if (builtinUsersResult.isEmpty()) { logger.info("User not found: " + username); return null; } - logger.info("User found: " + result.get(0).getUsername()); - return new DataverseUserAdapter(session, realmModel, model, result.get(0)); + DataverseAuthenticatedUser authenticatedUser = getAuthenticatedUserByUsername(username); + if (authenticatedUser == null) { + return null; + } + return new DataverseUserAdapter(session, realmModel, model, builtinUsersResult.get(0), authenticatedUser); } @Override @@ -101,9 +109,9 @@ public Stream searchForUserStream(RealmModel realm, Map query = em.createNamedQuery("DataverseUser.findByUsername", DataverseUser.class); + TypedQuery query = em.createNamedQuery("DataverseUser.findByUsername", DataverseBuiltinUser.class); query.setParameter("username", lower); - return query.getResultStream().map(entity -> new DataverseUserAdapter(session, realm, model, entity)); + return query.getResultStream().map(entity -> new DataverseUserAdapter(session, realm, model, entity, getAuthenticatedUserByUsername(entity.getUsername()))); } @Override @@ -115,4 +123,14 @@ public Stream getGroupMembersStream(RealmModel realmModel, GroupModel public Stream searchForUserByUserAttributeStream(RealmModel realmModel, String s, String s1) { return Stream.empty(); } + + private DataverseAuthenticatedUser getAuthenticatedUserByUsername(String username) { + TypedQuery query = em.createNamedQuery("DataverseAuthenticatedUser.findByIdentifier", DataverseAuthenticatedUser.class); + query.setParameter("identifier", username); + DataverseAuthenticatedUser singleResult = query.getSingleResult(); + if (singleResult == null) { + logger.info("Could not find authenticated user by username: " + username); + } + return singleResult; + } } diff --git a/conf/keycloak/builtin-users-spi/src/main/resources/META-INF/persistence.xml b/conf/keycloak/builtin-users-spi/src/main/resources/META-INF/persistence.xml index b0439d526a1..9e579281ba6 100644 --- a/conf/keycloak/builtin-users-spi/src/main/resources/META-INF/persistence.xml +++ b/conf/keycloak/builtin-users-spi/src/main/resources/META-INF/persistence.xml @@ -4,7 +4,8 @@ xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd" version="3.0"> - edu.harvard.iq.keycloak.auth.spi.DataverseUser + edu.harvard.iq.keycloak.auth.spi.DataverseBuiltinUser + edu.harvard.iq.keycloak.auth.spi.DataverseAuthenticatedUser