Attribute Resolution

Attribute resolution strategies are controlled by the Person Directory project. The Person Directory dependency is automatically bundled with the CAS server. Therefore, declaring an additional dependency will not be required. This Person Directory project supports both LDAP and JDBC attribute resolution, caching, attribute aggregation from multiple attribute sources, etc.

:information_source: Default Caching Policy

By default, attributes are cached to the length of the SSO session. This means that while the underlying component provided by Person Directory may have a different caching model, attributes by default and from a CAS perspective will not be refreshed and retrieved again on subsequent requests as long as the SSO session exists.

Actuator Endpoints

The following endpoints are provided by CAS:

 Resolve principal attributes for user.

 Remove cached attributes in the attribute repository for user.

 Display cached attributes in the attribute repository for user. If attributes are found in the cache, they are returned. Otherwise, attribute repositories will be contacted to fetch and cache person attributes again.


Person Directory

A framework for resolving persons and attributes from a variety of underlying sources. It consists of a collection of components that retrieve, cache, resolve, aggregate, merge person attributes from JDBC, LDAP and more.

The following settings and properties are available from the CAS configuration catalog:

The configuration settings listed below are tagged as Required in the CAS configuration metadata. This flag indicates that the presence of the setting may be needed to activate or affect the behavior of the CAS feature and generally should be reviewed, possibly owned and adjusted. If the setting is assigned a default value, you do not need to strictly put the setting in your copy of the configuration, but should review it nonetheless to make sure it matches your deployment expectations.

  • cas.person-directory.principal-transformation.groovy.location=
  • The location of the resource. Resources can be URLs, or files found either on the classpath or outside somewhere in the file system.

    In the event the configured resource is a Groovy script, specially if the script set to reload on changes, you may need to adjust the total number of inotify instances. On Linux, you may need to add the following line to /etc/sysctl.conf: fs.inotify.max_user_instances = 256.

    You can check the current value via cat /proc/sys/fs/inotify/max_user_instances.

    In situations and scenarios where CAS is able to automatically watch the underlying resource for changes and detect updates and modifications dynamically, you may be able to specify the following setting as either an environment variable or system property with a value of false to disable the resource watcher: org.apereo.cas.util.io.PathWatcherService.

    org.apereo.cas.configuration.model.core.authentication.GroovyPrincipalTransformationProperties.

    How can I configure this property?

    The configuration settings listed below are tagged as Optional in the CAS configuration metadata. This flag indicates that the presence of the setting is not immediately necessary in the end-user CAS configuration, because a default value is assigned or the activation of the feature is not conditionally controlled by the setting value. In other words, you should only include this field in your configuration if you need to modify the default value or if you need to turn on the feature controlled by the setting.

  • cas.person-directory.active-attribute-repository-ids=
  • Activated attribute repository identifiers that should be used for fetching attributes if attribute resolution is enabled. The list here may include identifiers separated by comma.

    org.apereo.cas.configuration.model.core.authentication.PersonDirectoryPrincipalResolverProperties.

    How can I configure this property?

  • cas.person-directory.attribute-repository-selection=
  • Control the behavior of the attribute repository selection by authentication method or handler. The map here is keyed by the authentication handler name, and the value is the attribute repository identifiers separated by comma. When the authentication handler is executed, the attribute repositories assigned to this handler will be selected to fetch attributes. Note that the resolution engine will always favor attribute repositories assigned to the service definition, if any and as part of its authentication policy, over this global setting.

    org.apereo.cas.configuration.model.core.authentication.PersonDirectoryPrincipalResolverProperties.

    How can I configure this property?

  • cas.person-directory.attribute-resolution-enabled=
  • Whether attribute repositories should be contacted to fetch person attributes. Defaults to true if not set. Available values are as follows:

    • TRUE: Constant to represent the true state.
    • FALSE: Constant to represent the false state.
    • UNDEFINED: Constant to represent the undefined state.

    org.apereo.cas.configuration.model.core.authentication.PersonDirectoryPrincipalResolverProperties.

    How can I configure this property?

  • cas.person-directory.principal-attribute=
  • Attribute name to use to indicate the identifier of the principal constructed. If the attribute is blank or has no values, the default principal id will be used determined by the underlying authentication engine. The principal id attribute usually is removed from the collection of attributes collected, though this behavior depends on the schematics of the underlying authentication strategy.

    org.apereo.cas.configuration.model.core.authentication.PersonDirectoryPrincipalResolverProperties.

    How can I configure this property?

  • cas.person-directory.principal-resolution-conflict-strategy=last
  • In the event that the principal resolution engine resolves more than one principal, (specially if such principals in the chain have different identifiers), this setting determines strategy by which the principal id would be chosen from the chain. Accepted values are: last, first.

    org.apereo.cas.configuration.model.core.authentication.PersonDirectoryPrincipalResolverProperties.

    How can I configure this property?

  • cas.person-directory.principal-resolution-failure-fatal=
  • When true, throws an error back indicating that principal resolution has failed and no principal can be found based on the authentication requirements. Otherwise, logs the condition as an error without raising a catastrophic error. Available values are as follows:

    • TRUE: Constant to represent the true state.
    • FALSE: Constant to represent the false state.
    • UNDEFINED: Constant to represent the undefined state.

    org.apereo.cas.configuration.model.core.authentication.PersonDirectoryPrincipalResolverProperties.

    How can I configure this property?

  • cas.person-directory.principal-transformation.blocking-pattern=
  • A regular expression that will be used against the username to match for blocking/forbidden values. If a match is found, an exception will be thrown and principal transformation will fail.

    This setting supports the Spring Expression Language.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

    How can I configure this property?

  • cas.person-directory.principal-transformation.case-conversion=NONE
  • Indicate whether the principal identifier should be transformed into upper-case, lower-case, etc. Available values are as follows:

    • NONE: No conversion.
    • LOWERCASE: Lowercase conversion.
    • UPPERCASE: Uppercase conversion.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

    How can I configure this property?

  • cas.person-directory.principal-transformation.pattern=
  • A regular expression that will be used against the provided username for username extractions. On a successful match, the first matched group in the pattern will be used as the extracted username.

    This setting supports the Spring Expression Language.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

    How can I configure this property?

  • cas.person-directory.principal-transformation.prefix=
  • Prefix to add to the principal id prior to authentication.

    This setting supports the Spring Expression Language.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

    How can I configure this property?

  • cas.person-directory.principal-transformation.suffix=
  • Suffix to add to the principal id prior to authentication.

    This setting supports the Spring Expression Language.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

    How can I configure this property?

  • cas.person-directory.return-null=
  • Return a null principal object if no attributes can be found for the principal. Available values are as follows:

    • TRUE: Constant to represent the true state.
    • FALSE: Constant to represent the false state.
    • UNDEFINED: Constant to represent the undefined state.

    org.apereo.cas.configuration.model.core.authentication.PersonDirectoryPrincipalResolverProperties.

    How can I configure this property?

  • cas.person-directory.use-existing-principal-id=
  • Uses an existing principal id that may have already been established in order to run person directory queries. This is generally useful in situations where authentication is delegated to an external identity provider and a principal is first established to then query an attribute source. Available values are as follows:

    • TRUE: Constant to represent the true state.
    • FALSE: Constant to represent the false state.
    • UNDEFINED: Constant to represent the undefined state.

    org.apereo.cas.configuration.model.core.authentication.PersonDirectoryPrincipalResolverProperties.

    How can I configure this property?

  • cas.person-directory.principal-transformation.groovy.location=
  • The location of the resource. Resources can be URLs, or files found either on the classpath or outside somewhere in the file system.

    In the event the configured resource is a Groovy script, specially if the script set to reload on changes, you may need to adjust the total number of inotify instances. On Linux, you may need to add the following line to /etc/sysctl.conf: fs.inotify.max_user_instances = 256.

    You can check the current value via cat /proc/sys/fs/inotify/max_user_instances.

    In situations and scenarios where CAS is able to automatically watch the underlying resource for changes and detect updates and modifications dynamically, you may be able to specify the following setting as either an environment variable or system property with a value of false to disable the resource watcher: org.apereo.cas.util.io.PathWatcherService.

    org.apereo.cas.configuration.model.core.authentication.GroovyPrincipalTransformationProperties.

    How can I configure this property?

  • cas.person-directory.principal-transformation.blocking-pattern=
  • A regular expression that will be used against the username to match for blocking/forbidden values. If a match is found, an exception will be thrown and principal transformation will fail.

    This setting supports the Spring Expression Language.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

    How can I configure this property?

  • cas.person-directory.principal-transformation.case-conversion=NONE
  • Indicate whether the principal identifier should be transformed into upper-case, lower-case, etc. Available values are as follows:

    • NONE: No conversion.
    • LOWERCASE: Lowercase conversion.
    • UPPERCASE: Uppercase conversion.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

    How can I configure this property?

  • cas.person-directory.principal-transformation.pattern=
  • A regular expression that will be used against the provided username for username extractions. On a successful match, the first matched group in the pattern will be used as the extracted username.

    This setting supports the Spring Expression Language.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

    How can I configure this property?

  • cas.person-directory.principal-transformation.prefix=
  • Prefix to add to the principal id prior to authentication.

    This setting supports the Spring Expression Language.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

    How can I configure this property?

  • cas.person-directory.principal-transformation.suffix=
  • Suffix to add to the principal id prior to authentication.

    This setting supports the Spring Expression Language.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

    How can I configure this property?

    Authentication handlers that generally deal with username-password credentials can be configured to transform the user id prior to executing the authentication sequence. Each authentication strategy in CAS provides settings to properly transform the principal. Refer to the relevant settings for the authentication strategy at hand to learn more.

    Authentication handlers as part of principal transformation may also be provided a path to a Groovy script to transform the provided username. The outline of the script may take on the following form:

    1
    2
    3
    4
    
    String run(final Object... args) {
        def (providedUsername,logger) = args
        return providedUsername.concat("SomethingElse")
    }
    

    Configuration Metadata

    The collection of configuration properties listed in this section are automatically generated from the CAS source and components that contain the actual field definitions, types, descriptions, modules, etc. This metadata may not always be 100% accurate, or could be lacking details and sufficient explanations.

    Be Selective

    This section is meant as a guide only. Do NOT copy/paste the entire collection of settings into your CAS configuration; rather pick only the properties that you need. Do NOT enable settings unless you are certain of their purpose and do NOT copy settings into your configuration only to keep them as reference. All these ideas lead to upgrade headaches, maintenance nightmares and premature aging.

    YAGNI

    Note that for nearly ALL use cases, declaring and configuring properties listed here is sufficient. You should NOT have to explicitly massage a CAS XML/Java/etc configuration file to design an authentication handler, create attribute release policies, etc. CAS at runtime will auto-configure all required changes for you. If you are unsure about the meaning of a given CAS setting, do NOT turn it on without hesitation. Review the codebase or better yet, ask questions to clarify the intended behavior.

    Naming Convention

    Property names can be specified in very relaxed terms. For instance cas.someProperty, cas.some-property, cas.some_property are all valid names. While all forms are accepted by CAS, there are certain components (in CAS and other frameworks used) whose activation at runtime is conditional on a property value, where this property is required to have been specified in CAS configuration using kebab case. This is both true for properties that are owned by CAS as well as those that might be presented to the system via an external library or framework such as Spring Boot, etc.

    :information_source: Note

    When possible, properties should be stored in lower-case kebab format, such as cas.property-name=value. The only possible exception to this rule is when naming actuator endpoints; The name of the actuator endpoints (i.e. ssoSessions) MUST remain in camelCase mode.

    Settings and properties that are controlled by the CAS platform directly always begin with the prefix cas. All other settings are controlled and provided to CAS via other underlying frameworks and may have their own schemas and syntax. BE CAREFUL with the distinction. Unrecognized properties are rejected by CAS and/or frameworks upon which CAS depends. This means if you somehow misspell a property definition or fail to adhere to the dot-notation syntax and such, your setting is entirely refused by CAS and likely the feature it controls will never be activated in the way you intend.

    Validation

    Configuration properties are automatically validated on CAS startup to report issues with configuration binding, specially if defined CAS settings cannot be recognized or validated by the configuration schema. Additional validation processes are also handled via Configuration Metadata and property migrations applied automatically on startup by Spring Boot and family.

    Indexed Settings

    CAS settings able to accept multiple values are typically documented with an index, such as cas.some.setting[0]=value. The index [0] is meant to be incremented by the adopter to allow for distinct multiple configuration blocks.

    Attribute sources are defined and configured to describe the global set of attributes to be fetched for each authenticated principal. That global set of attributes is then filtered by the service manager according to service-specific attribute release rules.

    Note that each attribute repository source can be assigned a unique identifier to be used for additional filtering. The attribute resolution engine provided by Person Directory can also be configured to only consult not all but a selection of attribute repository sources, deferring the task of attribute retrieval for later phases in the authentication process, such as releasing attributes.

    :information_source: Principal Resolution

    Note that in most if not all cases, CAS authentication is able to retrieve and resolve attributes from the authentication source, which would eliminate the need for configuring a separate resolver specially if both the authentication and the attribute source are the same. Using separate resolvers should only be required when sources are different, or when there is a need to tackle more advanced attribute resolution use cases such as cascading, merging, etc. See this guide for more info.

    The goal of the resolver is to construct a final identifiable authenticated principal for CAS which carries a number of attributes inside it. The behavior of the person-directory resolver is such that it attempts to locate the principal id, which in most cases is the same thing as the credential id provided during authentication or it could be noted by a custom attribute. Then the resolver starts to construct attributes from attribute repositories defined. If it realizes that a custom attribute is used to determine the principal id AND the same attribute is also set to be collected into the final set of attributes, it will then remove that attribute from the final collection.

    Note that by default, CAS auto-creates attribute repository sources that are appropriate for LDAP, JDBC, etc. If you need something more, you will need to resort to more elaborate measures of defining the bean configuration.

    More about the Person Directory and its configurable sources can be found here.

    Attribute Repositories

    Control the set of authentication attributes that are retrieved by the principal resolution process, from attribute sources unless noted otherwise by the specific authentication scheme.

    If multiple attribute repository sources are defined, they are added into a list and their results are cached and merged.

    The following options may be used to fetch attributes in CAS.

    Source Reference
    Stub See this guide.
    LDAP See this guide.
    Groovy See this guide.
    REST See this guide.
    Grouper See this guide.
    Redis See this guide.
    JDBC See this guide.
    OKTA See this guide.
    Custom See this guide.
    Microsoft Azure Active Directory See this guide.

    The following settings and properties are available from the CAS configuration catalog:

    The configuration settings listed below are tagged as Required in the CAS configuration metadata. This flag indicates that the presence of the setting may be needed to activate or affect the behavior of the CAS feature and generally should be reviewed, possibly owned and adjusted. If the setting is assigned a default value, you do not need to strictly put the setting in your copy of the configuration, but should review it nonetheless to make sure it matches your deployment expectations.

    The configuration settings listed below are tagged as Optional in the CAS configuration metadata. This flag indicates that the presence of the setting is not immediately necessary in the end-user CAS configuration, because a default value is assigned or the activation of the feature is not conditionally controlled by the setting value. In other words, you should only include this field in your configuration if you need to modify the default value or if you need to turn on the feature controlled by the setting.

  • cas.authn.attribute-repository.core.aggregation=MERGE
  • Indicates how the results of multiple attribute repositories should be aggregated together. Available values are as follows:

    • MERGE: Default. Designed to query multiple repositories in order and merge the results into a single result set.
    • CASCADE: Query multiple repositories in order and merge the results into a single result set. As each repository is queried the attributes from the first query in the result set are used as the query for the next repository.

    org.apereo.cas.configuration.model.core.authentication.PrincipalAttributesCoreProperties.

    How can I configure this property?

  • cas.authn.attribute-repository.core.default-attributes-to-release=
  • CAS provides the ability to release a bundle of principal attributes to all services by default. This bundle is not defined on a per-service basis and is always combined with attributes produced by the specific release policy of the service, such that for instance, you can devise rules to always release givenName and cn to every application, and additionally allow other specific principal attributes for only some applications per their attribute release policy.

    org.apereo.cas.configuration.model.core.authentication.PrincipalAttributesCoreProperties.

    How can I configure this property?

  • cas.authn.attribute-repository.core.expiration-time=30
  • Indicates the global cache expiration period, once attributes are fetched from the underlying attribute repository. A zero or negative value indicates that no attribute caching should take place where attributes must always be fetched from the source.

    org.apereo.cas.configuration.model.core.authentication.PrincipalAttributesCoreProperties.

    How can I configure this property?

  • cas.authn.attribute-repository.core.expiration-time-unit=
  • Expiration caching time unit for attributes.

    org.apereo.cas.configuration.model.core.authentication.PrincipalAttributesCoreProperties.

    How can I configure this property?

  • cas.authn.attribute-repository.core.maximum-cache-size=10000
  • Indicates the global cache size used to store attributes retrieved from the attribute repository.

    org.apereo.cas.configuration.model.core.authentication.PrincipalAttributesCoreProperties.

    How can I configure this property?

  • cas.authn.attribute-repository.core.merger=REPLACE
  • Merging strategies can be used to resolve conflicts when the same attributes are found from multiple sources. A merging strategy is used to handle conflicts for both principal attributes as well as those that are captured by the authentication attempt. Conflicts arise when the multiple attribute sources or repositories produce the same attribute with the same name, or when there are multiple legs in an authentication flow that produce the same attribute as authentication metadata for each leg of the attempt (i.e. when going through MFA flows). Available values are as follows:

    • REPLACE: Replace attributes. Overwrites existing attribute values, if any.
    • ADD: Add attributes. Retains existing attribute values if any, and ignores values from subsequent sources in the resolution chain.
    • SOURCE: No merging. Doesn't merge attributes, and returns the original collection of attributes as passed.
    • DESTINATION: No merging. Ignore the collection of original attributes that are passed and always favor what is supplied as a subsequent source and an override.
    • MULTIVALUED: Multivalued attributes. Combines all values into a single attribute, essentially creating a multi-valued attribute.

    org.apereo.cas.configuration.model.core.authentication.PrincipalAttributesCoreProperties.

    How can I configure this property?

  • cas.authn.attribute-repository.core.recover-exceptions=true
  • Recover from LDAP exceptions and continue with partial results. Otherwise, die and do not allow to log in.

    org.apereo.cas.configuration.model.core.authentication.PrincipalAttributesCoreProperties.

    How can I configure this property?

  • cas.authn.attribute-repository.core.require-all-repository-sources=false
  • In the event that multiple attribute repositories are defined, setting this option to true forces all repositories to produce a person object. If any of the repositories fails to produce a person or person attributes, the resolution engine will halt to short-circuit the process, failing to resolve the person altogether.

    org.apereo.cas.configuration.model.core.authentication.PrincipalAttributesCoreProperties.

    How can I configure this property?

  • cas.authn.attribute-repository.core.stop-cascading-when-no-initial-results=true
  • When #aggregation is set to AggregationStrategyTypes#CASCADE, this setting controls whether subsequent attribute repositories need to be contacted for person attributes, if the first attribute repository's query does not produce any results.

    org.apereo.cas.configuration.model.core.authentication.PrincipalAttributesCoreProperties.

    How can I configure this property?

    Configuration Metadata

    The collection of configuration properties listed in this section are automatically generated from the CAS source and components that contain the actual field definitions, types, descriptions, modules, etc. This metadata may not always be 100% accurate, or could be lacking details and sufficient explanations.

    Be Selective

    This section is meant as a guide only. Do NOT copy/paste the entire collection of settings into your CAS configuration; rather pick only the properties that you need. Do NOT enable settings unless you are certain of their purpose and do NOT copy settings into your configuration only to keep them as reference. All these ideas lead to upgrade headaches, maintenance nightmares and premature aging.

    YAGNI

    Note that for nearly ALL use cases, declaring and configuring properties listed here is sufficient. You should NOT have to explicitly massage a CAS XML/Java/etc configuration file to design an authentication handler, create attribute release policies, etc. CAS at runtime will auto-configure all required changes for you. If you are unsure about the meaning of a given CAS setting, do NOT turn it on without hesitation. Review the codebase or better yet, ask questions to clarify the intended behavior.

    Naming Convention

    Property names can be specified in very relaxed terms. For instance cas.someProperty, cas.some-property, cas.some_property are all valid names. While all forms are accepted by CAS, there are certain components (in CAS and other frameworks used) whose activation at runtime is conditional on a property value, where this property is required to have been specified in CAS configuration using kebab case. This is both true for properties that are owned by CAS as well as those that might be presented to the system via an external library or framework such as Spring Boot, etc.

    :information_source: Note

    When possible, properties should be stored in lower-case kebab format, such as cas.property-name=value. The only possible exception to this rule is when naming actuator endpoints; The name of the actuator endpoints (i.e. ssoSessions) MUST remain in camelCase mode.

    Settings and properties that are controlled by the CAS platform directly always begin with the prefix cas. All other settings are controlled and provided to CAS via other underlying frameworks and may have their own schemas and syntax. BE CAREFUL with the distinction. Unrecognized properties are rejected by CAS and/or frameworks upon which CAS depends. This means if you somehow misspell a property definition or fail to adhere to the dot-notation syntax and such, your setting is entirely refused by CAS and likely the feature it controls will never be activated in the way you intend.

    Validation

    Configuration properties are automatically validated on CAS startup to report issues with configuration binding, specially if defined CAS settings cannot be recognized or validated by the configuration schema. Additional validation processes are also handled via Configuration Metadata and property migrations applied automatically on startup by Spring Boot and family.

    Indexed Settings

    CAS settings able to accept multiple values are typically documented with an index, such as cas.some.setting[0]=value. The index [0] is meant to be incremented by the adopter to allow for distinct multiple configuration blocks.

    :information_source: Remember This

    Note that in certain cases, CAS authentication is able to retrieve and resolve attributes from the authentication source in the same authentication request, which would eliminate the need for configuring a separate attribute repository specially if both the authentication and the attribute source are the same. Using separate repositories should be required when sources are different, or when there is a need to tackle more advanced attribute resolution use cases such as cascading, merging, etc.

    Attributes for all sources are defined in their own individual block. CAS does not care about the source owner of attributes. It finds them where they can be found and otherwise, it moves on. This means that certain number of attributes can be resolved via one source and the remaining attributes may be resolved via another. If there are commonalities across sources, the merger shall decide the final result and behavior.

    Note that attribute repository sources, if/when defined, execute in a specific order. This is important to take into account when attribute merging may take place.

    Note that if no explicit attribute mappings are defined, all permitted attributes on the record may be retrieved by CAS from the attribute repository source and made available to the principal. On the other hand, if explicit attribute mappings are defined, then only mapped attributes are retrieved.

    The following merging strategies can be used to resolve conflicts when the same attribute are found from multiple sources:

    Type Description
    REPLACE Overwrites existing attribute values, if any.
    ADD Retains existing attribute values if any, and ignores values from subsequent sources in the resolution chain.
    MULTIVALUED Combines all values into a single attribute, essentially creating a multi-valued attribute.
    NONE Do not merge attributes, only use attributes retrieved during authentication.

    The following aggregation strategies can be used to resolve and merge attributes when multiple attribute repository sources are defined to fetch data:

    Type Description
    MERGE Default. Query multiple repositories in order and merge the results into a single result set.
    CASCADE Same as above; results from each query are passed down to the next attribute repository source. If the first repository queried has no results, no further attribute repositories will be queried.