diff --git a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/UserAdapter.java b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/UserAdapter.java index 3e782c352ce..79a190f8729 100755 --- a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/UserAdapter.java +++ b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/UserAdapter.java @@ -204,7 +204,7 @@ public class UserAdapter implements CachedUserModel.Streams { @Override public String getFirstAttribute(String name) { if (updated != null) return updated.getFirstAttribute(name); - return cached.getAttributes(modelSupplier).getFirst(name); + return cached.getFirstAttribute(name, modelSupplier); } @Override diff --git a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/entities/CachedUser.java b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/entities/CachedUser.java index d6d04936533..eb47b5dfbad 100755 --- a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/entities/CachedUser.java +++ b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/entities/CachedUser.java @@ -41,16 +41,15 @@ import java.util.stream.Collectors; public class CachedUser extends AbstractExtendableRevisioned implements InRealm { private final String realm; - private final String username; private final Long createdTimestamp; - private final String email; private final boolean emailVerified; private final boolean enabled; private final String federationLink; private final String serviceAccountClientLink; private final int notBefore; private final LazyLoader> requiredActions; - private final LazyLoader> attributes; + private final LazyLoader> lazyLoadedAttributes; + private final MultivaluedHashMap eagerLoadedAttributes; private final LazyLoader> roleMappings; private final LazyLoader> groups; private final LazyLoader> storedCredentials; @@ -58,16 +57,19 @@ public class CachedUser extends AbstractExtendableRevisioned implements InRealm public CachedUser(Long revision, RealmModel realm, UserModel user, int notBefore) { super(revision, user.getId()); this.realm = realm.getId(); - this.username = user.getUsername(); this.createdTimestamp = user.getCreatedTimestamp(); - this.email = user.getEmail(); this.emailVerified = user.isEmailVerified(); this.enabled = user.isEnabled(); this.federationLink = user.getFederationLink(); this.serviceAccountClientLink = user.getServiceAccountClientLink(); this.notBefore = notBefore; + this.eagerLoadedAttributes = new MultivaluedHashMap<>(); + this.eagerLoadedAttributes.putSingle(UserModel.USERNAME,user.getUsername()); + this.eagerLoadedAttributes.putSingle(UserModel.FIRST_NAME,user.getFirstName()); + this.eagerLoadedAttributes.putSingle(UserModel.LAST_NAME,user.getLastName()); + this.eagerLoadedAttributes.putSingle(UserModel.EMAIL,user.getEmail()); + this.lazyLoadedAttributes = new DefaultLazyLoader<>(userModel -> new MultivaluedHashMap<>(userModel.getAttributes()), MultivaluedHashMap::new); this.requiredActions = new DefaultLazyLoader<>(userModel -> userModel.getRequiredActionsStream().collect(Collectors.toSet()), Collections::emptySet); - this.attributes = new DefaultLazyLoader<>(userModel -> new MultivaluedHashMap<>(userModel.getAttributes()), MultivaluedHashMap::new); this.roleMappings = new DefaultLazyLoader<>(userModel -> userModel.getRoleMappingsStream().map(RoleModel::getId).collect(Collectors.toSet()), Collections::emptySet); this.groups = new DefaultLazyLoader<>(userModel -> userModel.getGroupsStream().map(GroupModel::getId).collect(Collectors.toCollection(LinkedHashSet::new)), LinkedHashSet::new); this.storedCredentials = new DefaultLazyLoader<>(userModel -> userModel.credentialManager().getStoredCredentialsStream().collect(Collectors.toCollection(LinkedList::new)), LinkedList::new); @@ -78,7 +80,14 @@ public class CachedUser extends AbstractExtendableRevisioned implements InRealm } public String getUsername() { - return username; + return eagerLoadedAttributes.getFirst(UserModel.USERNAME); + } + + public String getFirstAttribute(String name, Supplier userModel) { + if(eagerLoadedAttributes.containsKey(name)) + return eagerLoadedAttributes.getFirst(name); + else + return this.lazyLoadedAttributes.get(userModel).getFirst(name); } public Long getCreatedTimestamp() { @@ -86,7 +95,7 @@ public class CachedUser extends AbstractExtendableRevisioned implements InRealm } public String getEmail() { - return email; + return eagerLoadedAttributes.getFirst(UserModel.EMAIL); } public boolean isEmailVerified() { @@ -98,7 +107,7 @@ public class CachedUser extends AbstractExtendableRevisioned implements InRealm } public MultivaluedHashMap getAttributes(Supplier userModel) { - return attributes.get(userModel); + return lazyLoadedAttributes.get(userModel); } public Set getRequiredActions(Supplier userModel) {