Search in sources :

Example 1 with UserAttributeEntity

use of org.keycloak.models.jpa.entities.UserAttributeEntity in project keycloak by keycloak.

the class JpaUserProvider method searchForUserStream.

@Override
public Stream<UserModel> searchForUserStream(RealmModel realm, Map<String, String> attributes, Integer firstResult, Integer maxResults) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<UserEntity> queryBuilder = builder.createQuery(UserEntity.class);
    Root<UserEntity> root = queryBuilder.from(UserEntity.class);
    List<Predicate> predicates = new ArrayList<>();
    List<Predicate> attributePredicates = new ArrayList<>();
    predicates.add(builder.equal(root.get("realmId"), realm.getId()));
    if (!session.getAttributeOrDefault(UserModel.INCLUDE_SERVICE_ACCOUNT, true)) {
        predicates.add(root.get("serviceAccountClientLink").isNull());
    }
    Join<Object, Object> federatedIdentitiesJoin = null;
    for (Map.Entry<String, String> entry : attributes.entrySet()) {
        String key = entry.getKey();
        String value = entry.getValue();
        if (value == null) {
            continue;
        }
        switch(key) {
            case UserModel.SEARCH:
                for (String stringToSearch : value.trim().split("\\s+")) {
                    predicates.add(builder.or(getSearchOptionPredicateArray(stringToSearch, builder, root)));
                }
                break;
            case USERNAME:
            case FIRST_NAME:
            case LAST_NAME:
            case EMAIL:
                if (Boolean.valueOf(attributes.getOrDefault(UserModel.EXACT, Boolean.FALSE.toString()))) {
                    predicates.add(builder.equal(builder.lower(root.get(key)), value.toLowerCase()));
                } else {
                    predicates.add(builder.like(builder.lower(root.get(key)), "%" + value.toLowerCase() + "%"));
                }
                break;
            case EMAIL_VERIFIED:
                predicates.add(builder.equal(root.get(key), Boolean.parseBoolean(value.toLowerCase())));
                break;
            case UserModel.ENABLED:
                predicates.add(builder.equal(root.get(key), Boolean.parseBoolean(value)));
                break;
            case UserModel.IDP_ALIAS:
                if (federatedIdentitiesJoin == null) {
                    federatedIdentitiesJoin = root.join("federatedIdentities");
                }
                predicates.add(builder.equal(federatedIdentitiesJoin.get("identityProvider"), value));
                break;
            case UserModel.IDP_USER_ID:
                if (federatedIdentitiesJoin == null) {
                    federatedIdentitiesJoin = root.join("federatedIdentities");
                }
                predicates.add(builder.equal(federatedIdentitiesJoin.get("userId"), value));
                break;
            case UserModel.EXACT:
                break;
            // All unknown attributes will be assumed as custom attributes
            default:
                Join<UserEntity, UserAttributeEntity> attributesJoin = root.join("attributes", JoinType.LEFT);
                attributePredicates.add(builder.and(builder.equal(builder.lower(attributesJoin.get("name")), key.toLowerCase()), builder.equal(builder.lower(attributesJoin.get("value")), value.toLowerCase())));
                break;
        }
    }
    if (!attributePredicates.isEmpty()) {
        predicates.add(builder.and(attributePredicates.toArray(new Predicate[0])));
    }
    Set<String> userGroups = (Set<String>) session.getAttribute(UserModel.GROUPS);
    if (userGroups != null) {
        Subquery subquery = queryBuilder.subquery(String.class);
        Root<UserGroupMembershipEntity> from = subquery.from(UserGroupMembershipEntity.class);
        subquery.select(builder.literal(1));
        List<Predicate> subPredicates = new ArrayList<>();
        subPredicates.add(from.get("groupId").in(userGroups));
        subPredicates.add(builder.equal(from.get("user").get("id"), root.get("id")));
        Subquery subquery1 = queryBuilder.subquery(String.class);
        subquery1.select(builder.literal(1));
        Root from1 = subquery1.from(ResourceEntity.class);
        List<Predicate> subs = new ArrayList<>();
        Expression<String> groupId = from.get("groupId");
        subs.add(builder.like(from1.get("name"), builder.concat("group.resource.", groupId)));
        subquery1.where(subs.toArray(new Predicate[subs.size()]));
        subPredicates.add(builder.exists(subquery1));
        subquery.where(subPredicates.toArray(new Predicate[subPredicates.size()]));
        predicates.add(builder.exists(subquery));
    }
    queryBuilder.where(predicates.toArray(new Predicate[predicates.size()])).orderBy(builder.asc(root.get(UserModel.USERNAME)));
    TypedQuery<UserEntity> query = em.createQuery(queryBuilder);
    UserProvider users = session.users();
    return closing(paginateQuery(query, firstResult, maxResults).getResultStream()).map(userEntity -> users.getUserById(realm, userEntity.getId()));
}
Also used : CriteriaBuilder(javax.persistence.criteria.CriteriaBuilder) UserAttributeEntity(org.keycloak.models.jpa.entities.UserAttributeEntity) UserGroupMembershipEntity(org.keycloak.models.jpa.entities.UserGroupMembershipEntity) Set(java.util.Set) HashSet(java.util.HashSet) Root(javax.persistence.criteria.Root) ArrayList(java.util.ArrayList) Subquery(javax.persistence.criteria.Subquery) UserEntity(org.keycloak.models.jpa.entities.UserEntity) Predicate(javax.persistence.criteria.Predicate) UserProvider(org.keycloak.models.UserProvider) Map(java.util.Map) HashMap(java.util.HashMap)

Example 2 with UserAttributeEntity

use of org.keycloak.models.jpa.entities.UserAttributeEntity in project keycloak by keycloak.

the class UserAdapter method persistAttributeValue.

private void persistAttributeValue(String name, String value) {
    UserAttributeEntity attr = new UserAttributeEntity();
    attr.setId(KeycloakModelUtils.generateId());
    attr.setName(name);
    attr.setValue(value);
    attr.setUser(user);
    em.persist(attr);
    user.getAttributes().add(attr);
}
Also used : UserAttributeEntity(org.keycloak.models.jpa.entities.UserAttributeEntity)

Example 3 with UserAttributeEntity

use of org.keycloak.models.jpa.entities.UserAttributeEntity in project keycloak by keycloak.

the class UserAdapter method getAttributes.

@Override
public Map<String, List<String>> getAttributes() {
    MultivaluedHashMap<String, String> result = new MultivaluedHashMap<>();
    for (UserAttributeEntity attr : user.getAttributes()) {
        result.add(attr.getName(), attr.getValue());
    }
    result.add(UserModel.FIRST_NAME, user.getFirstName());
    result.add(UserModel.LAST_NAME, user.getLastName());
    result.add(UserModel.EMAIL, user.getEmail());
    result.add(UserModel.USERNAME, user.getUsername());
    return result;
}
Also used : MultivaluedHashMap(org.keycloak.common.util.MultivaluedHashMap) UserAttributeEntity(org.keycloak.models.jpa.entities.UserAttributeEntity)

Example 4 with UserAttributeEntity

use of org.keycloak.models.jpa.entities.UserAttributeEntity in project keycloak by keycloak.

the class UserAdapter method removeAttribute.

@Override
public void removeAttribute(String name) {
    List<UserAttributeEntity> toRemove = new ArrayList<>();
    for (UserAttributeEntity attr : user.getAttributes()) {
        if (attr.getName().equals(name)) {
            toRemove.add(attr);
        }
    }
    if (toRemove.isEmpty()) {
        return;
    }
    // KEYCLOAK-3296 : Remove attribute through HQL to avoid StaleUpdateException
    Query query = em.createNamedQuery("deleteUserAttributesByNameAndUser");
    query.setParameter("name", name);
    query.setParameter("userId", user.getId());
    query.executeUpdate();
    // KEYCLOAK-3494 : Also remove attributes from local user entity
    user.getAttributes().removeAll(toRemove);
}
Also used : UserAttributeEntity(org.keycloak.models.jpa.entities.UserAttributeEntity) TypedQuery(javax.persistence.TypedQuery) CriteriaQuery(javax.persistence.criteria.CriteriaQuery) Query(javax.persistence.Query) ArrayList(java.util.ArrayList)

Example 5 with UserAttributeEntity

use of org.keycloak.models.jpa.entities.UserAttributeEntity in project keycloak by keycloak.

the class UserAdapter method setSingleAttribute.

@Override
public void setSingleAttribute(String name, String value) {
    if (UserModel.FIRST_NAME.equals(name)) {
        user.setFirstName(value);
        return;
    } else if (UserModel.LAST_NAME.equals(name)) {
        user.setLastName(value);
        return;
    } else if (UserModel.EMAIL.equals(name)) {
        setEmail(value);
        return;
    } else if (UserModel.USERNAME.equals(name)) {
        setUsername(value);
        return;
    }
    // Remove all existing
    if (value == null) {
        user.getAttributes().removeIf(a -> a.getName().equals(name));
    } else {
        String firstExistingAttrId = null;
        List<UserAttributeEntity> toRemove = new ArrayList<>();
        for (UserAttributeEntity attr : user.getAttributes()) {
            if (attr.getName().equals(name)) {
                if (firstExistingAttrId == null) {
                    attr.setValue(value);
                    firstExistingAttrId = attr.getId();
                } else {
                    toRemove.add(attr);
                }
            }
        }
        if (firstExistingAttrId != null) {
            // Remove attributes through HQL to avoid StaleUpdateException
            Query query = em.createNamedQuery("deleteUserAttributesByNameAndUserOtherThan");
            query.setParameter("name", name);
            query.setParameter("userId", user.getId());
            query.setParameter("attrId", firstExistingAttrId);
            int numUpdated = query.executeUpdate();
            // Remove attribute from local entity
            user.getAttributes().removeAll(toRemove);
        } else {
            persistAttributeValue(name, value);
        }
    }
}
Also used : UserAttributeEntity(org.keycloak.models.jpa.entities.UserAttributeEntity) TypedQuery(javax.persistence.TypedQuery) CriteriaQuery(javax.persistence.criteria.CriteriaQuery) Query(javax.persistence.Query) ArrayList(java.util.ArrayList)

Aggregations

UserAttributeEntity (org.keycloak.models.jpa.entities.UserAttributeEntity)5 ArrayList (java.util.ArrayList)3 Query (javax.persistence.Query)2 TypedQuery (javax.persistence.TypedQuery)2 CriteriaQuery (javax.persistence.criteria.CriteriaQuery)2 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 Map (java.util.Map)1 Set (java.util.Set)1 CriteriaBuilder (javax.persistence.criteria.CriteriaBuilder)1 Predicate (javax.persistence.criteria.Predicate)1 Root (javax.persistence.criteria.Root)1 Subquery (javax.persistence.criteria.Subquery)1 MultivaluedHashMap (org.keycloak.common.util.MultivaluedHashMap)1 UserProvider (org.keycloak.models.UserProvider)1 UserEntity (org.keycloak.models.jpa.entities.UserEntity)1 UserGroupMembershipEntity (org.keycloak.models.jpa.entities.UserGroupMembershipEntity)1