Class DefaultAttributes

java.lang.Object
java.util.AbstractMap<K,V>
java.util.HashMap<String,List<String>>
org.keycloak.userprofile.DefaultAttributes
All Implemented Interfaces:
Serializable, Cloneable, Map<String,List<String>>, Attributes
Direct Known Subclasses:
ServiceAccountAttributes

public class DefaultAttributes extends HashMap<String,List<String>> implements Attributes

The default implementation for Attributes. Should be reused as much as possible by the different implementations of UserProfileProvider.

One of the main aspects of this implementation is to allow normalizing attributes accordingly to the profile configuration and current context. As such, it provides some common normalization to common profile attributes (e.g.: username, email, first and last names, dynamic read-only attributes).

This implementation is not specific to any user profile implementation.

Author:
Pedro Igor
See Also:
  • Field Details

    • READ_ONLY_ATTRIBUTE_KEY

      public static final String READ_ONLY_ATTRIBUTE_KEY
      To reference dynamic attributes that can be configured as read-only when setting up the provider. We should probably remove that once we remove the legacy provider, because this will come from the configuration.
      See Also:
    • DEFAULT_MAX_LENGTH_ATTRIBUTES

      public static final String DEFAULT_MAX_LENGTH_ATTRIBUTES
      See Also:
    • context

      protected final UserProfileContext context
    • session

      protected final KeycloakSession session
    • user

      protected final UserModel user
  • Constructor Details

  • Method Details

    • isReadOnly

      public boolean isReadOnly(String name)
      Description copied from interface: Attributes
      Checks whether an attribute is read-only.
      Specified by:
      isReadOnly in interface Attributes
      Parameters:
      name - the attribute name
      Returns:
      true if the attribute is read-only. Otherwise, false
    • isReadOnlyFromMetadata

      protected boolean isReadOnlyFromMetadata(String attributeName)
      Checks whether an attribute is marked as read only by looking at its metadata.
      Parameters:
      attributeName - the attribute name
      Returns:
    • isRequired

      public boolean isRequired(String name)
      Description copied from interface: Attributes
      Returns whether the attribute with the given name is required.
      Specified by:
      isRequired in interface Attributes
      Parameters:
      name - the attribute name
      Returns:
      true if the attribute is required. Otherwise, false.
    • validate

      public boolean validate(String name, Consumer<ValidationError>... listeners)
      Description copied from interface: Attributes
      Validates the attribute with the given name.
      Specified by:
      validate in interface Attributes
      Parameters:
      name - the name of the attribute
      listeners - the listeners for listening for errors. ValidationError.inputHint contains name of the attribute in error.
      Returns:
      true if validation is successful. Otherwise, false. In case there is no attribute with the given name, false is also returned but without triggering listeners
    • addDefaultValidators

      protected void addDefaultValidators(String name, List<AttributeMetadata> metadatas)
    • get

      public List<String> get(String name)
      Description copied from interface: Attributes
      Returns all values for an attribute with the given name.
      Specified by:
      get in interface Attributes
      Parameters:
      name - the name of the attribute
      Returns:
      the attribute values
    • contains

      public boolean contains(String name)
      Description copied from interface: Attributes
      Checks whether an attribute with the given name is defined.
      Specified by:
      contains in interface Attributes
      Parameters:
      name - the name of the attribute
      Returns:
      true if the attribute is defined. Otherwise, false
    • nameSet

      public Set<String> nameSet()
      Description copied from interface: Attributes
      Returns the names of all defined attributes.
      Specified by:
      nameSet in interface Attributes
      Returns:
      the set of attribute names
    • getWritable

      public Map<String,List<String>> getWritable()
      Description copied from interface: Attributes
      Returns all the attributes with read-write permissions in a particular UserProfileContext.
      Specified by:
      getWritable in interface Attributes
      Returns:
      the attributes
    • getMetadata

      public AttributeMetadata getMetadata(String name)
      Description copied from interface: Attributes

      Returns the metadata associated with the attribute with the given name.

      The AttributeMetadata is a copy of the original metadata. The original metadata keeps immutable.

      Specified by:
      getMetadata in interface Attributes
      Parameters:
      name - the attribute name
      Returns:
      the metadata
    • getReadable

      public Map<String,List<String>> getReadable()
      Description copied from interface: Attributes
      Returns only the attributes that have read permissions in a particular UserProfileContext.
      Specified by:
      getReadable in interface Attributes
      Returns:
      the attributes with read permission.
    • toMap

      public Map<String,List<String>> toMap()
      Description copied from interface: Attributes
      Returns the attributes as a Map that are accessible to a particular UserProfileContext.
      Specified by:
      toMap in interface Attributes
      Returns:
      a map with all the attributes
    • createAttributeContext

      protected AttributeContext createAttributeContext(AttributeMetadata metadata)
    • normalizeAttributeValues

      protected List<String> normalizeAttributeValues(String name, Object value)
      Intentionally kept to protected visibility to allow for custom normalization logic while clients adopt User Profile
    • isAllowUnmanagedAttribute

      protected boolean isAllowUnmanagedAttribute()
    • setUserName

      protected void setUserName(Map<String,List<String>> newAttributes, List<String> values)
    • isIncludeAttributeIfNotProvided

      protected boolean isIncludeAttributeIfNotProvided(AttributeMetadata metadata)
    • isSupportedAttribute

      protected boolean isSupportedAttribute(String name)

      Checks whether an attribute is support by the profile configuration and the current context.

      This method can be used to avoid unexpected attributes from being added as an attribute because the attribute source is a regular Map and not normalized.

      Parameters:
      name - the name of the attribute
      Returns:
    • isReadOnlyInternalAttribute

      protected boolean isReadOnlyInternalAttribute(String attributeName)

      Returns whether an attribute is read only based on the provider configuration (using provider config), usually related to internal attributes managed by the server.

      For user-defined attributes, it should be preferable to use the user profile configuration.

      Parameters:
      attributeName - the attribute name
      Returns:
      true if the attribute is readonly. Otherwise, returns false
    • getUnmanagedAttributes

      public Map<String,List<String>> getUnmanagedAttributes()
      Description copied from interface: Attributes
      Returns a Map holding any unmanaged attribute.
      Specified by:
      getUnmanagedAttributes in interface Attributes
      Returns:
      a map with any unmanaged attribute
    • createUnmanagedAttributeMetadata

      protected AttributeMetadata createUnmanagedAttributeMetadata(String name)