org.apache.catalina.realm

## Class JNDIRealm

- java.lang.Object
- - org.apache.catalina.util.LifecycleBase
  - - org.apache.catalina.util.LifecycleMBeanBase
    - - org.apache.catalina.realm.RealmBase
      - - org.apache.catalina.realm.JNDIRealm

All Implemented Interfaces:
  MBeanRegistration, Lifecycle, Realm

    public class JNDIRealm
    extends RealmBase

Implementation of Realm that works with a directory server accessed via the Java Naming and Directory Interface (JNDI) APIs. The following constraints are imposed on the data structure in the underlying directory server:

- Each user that can be authenticated is represented by an individual element in the top level `DirContext` that is accessed via the `connectionURL` property.
- If a socket connection can not be made to the `connectURL` an attempt will be made to use the `alternateURL` if it exists.
- Each user element has a distinguished name that can be formed by substituting the presented username into a pattern configured by the `userPattern` property.
- Alternatively, if the `userPattern` property is not specified, a unique element can be located by searching the directory context. In this case:
  - The `userSearch` pattern specifies the search filter after substitution of the username.
  - The `userBase` property can be set to the element that is the base of the subtree containing users. If not specified, the search base is the top-level context.
  - The `userSubtree` property can be set to `true` if you wish to search the entire subtree of the directory context. The default value of `false` requests a search of only the current level.
- The user may be authenticated by binding to the directory with the username and password presented. This method is used when the `userPassword` property is not specified.
- The user may be authenticated by retrieving the value of an attribute from the directory and comparing it explicitly with the value presented by the user. This method is used when the `userPassword` property is specified, in which case:
  - The element for this user must contain an attribute named by the `userPassword` property.
  - The value of the user password attribute is either a cleartext String, or the result of passing a cleartext String through the `RealmBase.digest()` method (using the standard digest support included in `RealmBase`).
  - The user is considered to be authenticated if the presented credentials (after being passed through `RealmBase.digest()`) are equal to the retrieved value for the user password attribute.
- Each group of users that has been assigned a particular role may be represented by an individual element in the top level `DirContext` that is accessed via the `connectionURL` property. This element has the following characteristics:
  - The set of all possible groups of interest can be selected by a search pattern configured by the `roleSearch` property.
  - The `roleSearch` pattern optionally includes pattern replacements "{0}" for the distinguished name, and/or "{1}" for the username, and/or "{2}" the value of an attribute from the user's directory entry (the attribute is specified by the `userRoleAttribute` property), of the authenticated user for which roles will be retrieved.
  - The `roleBase` property can be set to the element that is the base of the search for matching roles. If not specified, the entire context will be searched.
  - The `roleSubtree` property can be set to `true` if you wish to search the entire subtree of the directory context. The default value of `false` requests a search of only the current level.
  - The element includes an attribute (whose name is configured by the `roleName` property) containing the name of the role represented by this element.
- In addition, roles may be represented by the values of an attribute in the user's element whose name is configured by the `userRoleName` property.
- A default role can be assigned to each user that was successfully authenticated by setting the `commonRole` property to the name of this role. The role doesn't have to exist in the directory.
- If the directory server contains nested roles, you can search for them by setting `roleNested` to `true`. The default value is `false`, so role searches will not find nested roles.
- Note that the standard `<security-role-ref>` element in the web application deployment descriptor allows applications to refer to roles programmatically by names other than those used in the directory server itself.

TODO - Support connection pooling (including message format objects) so that `authenticate()` does not have to be synchronized.

WARNING - There is a reported bug against the Netscape provider code (com.netscape.jndi.ldap.LdapContextFactory) with respect to successfully authenticated a non-existing user. The report is here: http://issues.apache.org/bugzilla/show_bug.cgi?id=11210 . With luck, Netscape has updated their provider code and this is not an issue.

Author:
  John Holman, Craig R. McClanahan

### Nested Class Summary

Nested Classes
`protected static class` `JNDIRealm.User` A protected class representing a User

### Nested classes/interfaces inherited from class org.apache.catalina.realm.RealmBase

`RealmBase.AllRolesMode`

### Field Summary

Fields
`protected boolean` `adCompat` Should we ignore PartialResultExceptions when iterating over NamingEnumerations?
`protected String` `alternateURL` An alternate URL, to which, we should connect if connectionURL fails.
`protected String` `authentication` The type of authentication to use
`protected String` `commonRole` Add this role to every authenticated user
`protected int` `connectionAttempt` The number of connection attempts.
`protected String` `connectionName` The connection username for the server we will contact.
`protected String` `connectionPassword` The connection password for the server we will contact.
`protected String` `connectionTimeout` The timeout, in milliseconds, to use when trying to create a connection to the directory.
`protected String` `connectionURL` The connection URL for the server we will contact.
`protected DirContext` `context` The directory context linking us to our directory server.
`protected String` `contextFactory` The JNDI context factory used to acquire our InitialContext.
`static String` `DEREF_ALIASES` Constant that holds the name of the environment property for specifying the manner in which aliases should be dereferenced.
`protected String` `derefAliases` How aliases should be dereferenced during search operations.
`protected static String` `info` Descriptive information about this Realm implementation.
`protected static String` `name` Descriptive information about this Realm implementation.
`protected String` `protocol` The protocol that will be used in the communication with the directory server.
`protected String` `referrals` How should we handle referrals?
`protected String` `roleBase` The base element for role searches.
`protected MessageFormat` `roleBaseFormat` The MessageFormat object associated with the current `roleBase`.
`protected MessageFormat` `roleFormat` The MessageFormat object associated with the current `roleSearch`.
`protected String` `roleName` The name of the attribute containing roles held elsewhere
`protected boolean` `roleNested` Should we look for nested group in order to determine roles?
`protected String` `roleSearch` The message format used to select roles for a user, with "{0}" marking the spot where the distinguished name of the user goes.
`protected boolean` `roleSearchAsUser` When searching for user roles, should the search be performed as the user currently being authenticated?
`protected boolean` `roleSubtree` Should we search the entire subtree for matching memberships?
`protected long` `sizeLimit` The sizeLimit (also known as the countLimit) to use when the realm is configured with `userSearch`.
`protected String` `spnegoDelegationQop` The QOP that should be used for the connection to the LDAP server after authentication.
`protected int` `timeLimit` The timeLimit (in milliseconds) to use when the realm is configured with `userSearch`.
`protected boolean` `useDelegatedCredential` Should delegated credentials from the SPNEGO authenticator be used if available
`protected String` `userBase` The base element for user searches.
`protected String` `userPassword` The attribute name used to retrieve the user password.
`protected String` `userPattern` The message format used to form the distinguished name of a user, with "{0}" marking the spot where the specified username goes.
`protected String[]` `userPatternArray` A string of LDAP user patterns or paths, ":"-separated These will be used to form the distinguished name of a user, with "{0}" marking the spot where the specified username goes.
`protected MessageFormat[]` `userPatternFormatArray` An array of MessageFormat objects associated with the current `userPatternArray`.
`protected String` `userRoleAttribute` The name of the attribute inside the users directory entry where the value will be taken to search for roles This attribute is not used during a nested search
`protected String` `userRoleName` The name of an attribute in the user's entry containing roles for that user
`protected String` `userSearch` The message format used to search for a user, with "{0}" marking the spot where the username goes.
`protected MessageFormat` `userSearchFormat` The MessageFormat object associated with the current `userSearch`.
`protected boolean` `userSubtree` Should we search the entire subtree for matching users?

### Fields inherited from class org.apache.catalina.realm.RealmBase

`allRolesMode, container, containerLog, digest, digestEncoding, md, md5Encoder, md5Helper, realmPath, sm, stripRealmForGss, support, validate, x509UsernameRetriever, x509UsernameRetrieverClassName`

### Fields inherited from class org.apache.catalina.util.LifecycleMBeanBase

`mserver`

### Fields inherited from interface org.apache.catalina.Lifecycle

`AFTER_DESTROY_EVENT, AFTER_INIT_EVENT, AFTER_START_EVENT, AFTER_STOP_EVENT, BEFORE_DESTROY_EVENT, BEFORE_INIT_EVENT, BEFORE_START_EVENT, BEFORE_STOP_EVENT, CONFIGURE_START_EVENT, CONFIGURE_STOP_EVENT, PERIODIC_EVENT, START_EVENT, STOP_EVENT`

### Constructor Summary

Constructors
Constructor and Description
`JNDIRealm()`

### Method Summary

Methods
`Principal` `authenticate(DirContext context, String username, String credentials)` Return the Principal associated with the specified username and credentials, if there is one; otherwise return `null`.
`Principal` `authenticate(String username, String credentials)` Return the Principal associated with the specified username and credentials, if there is one; otherwise return `null`.
`protected boolean` `bindAsUser(DirContext context, JNDIRealm.User user, String credentials)` Check credentials by binding to the directory as the user
`protected boolean` `checkCredentials(DirContext context, JNDIRealm.User user, String credentials)` Check whether the given User can be authenticated with the given credentials.
`protected void` `close(DirContext context)` Close any open connection to the directory server for this Realm.
`protected boolean` `compareCredentials(DirContext context, JNDIRealm.User info, String credentials)` Check whether the credentials presented by the user match those retrieved from the directory.
`protected String` `doRFC2254Encoding(String inString)` Given an LDAP search string, returns the string with certain characters escaped according to RFC 2254 guidelines.
`boolean` `getAdCompat()` Returns the current settings for handling PartialResultExceptions
`String` `getAlternateURL()` Getter for property alternateURL.
`String` `getAuthentication()` Return the type of authentication to use.
`String` `getCommonRole()` Return the common role
`String` `getConnectionName()` Return the connection username for this Realm.
`String` `getConnectionPassword()` Return the connection password for this Realm.
`String` `getConnectionTimeout()` Return the connection timeout.
`String` `getConnectionURL()` Return the connection URL for this Realm.
`String` `getContextFactory()` Return the JNDI context factory for this Realm.
`String` `getDerefAliases()` Return the derefAliases setting to be used.
`protected Hashtable<String,String>` `getDirectoryContextEnvironment()` Create our directory context configuration.
`protected String` `getDistinguishedName(DirContext context, String base, SearchResult result)` Returns the distinguished name of a search result.
`String` `getInfo()` Return descriptive information about this Realm implementation and the corresponding version number, in the format `<description>/<version>`.
`protected String` `getName()` Return a short name for this Realm implementation.
`protected String` `getPassword(String username)` Return the password associated with the given principal's user name.
`protected Principal` `getPrincipal(DirContext context, String username, GSSCredential gssCredential)` Return the Principal associated with the given user name.
`protected Principal` `getPrincipal(String username)` Return the Principal associated with the given user name.
`protected Principal` `getPrincipal(String username, GSSCredential gssCredential)`
`String` `getProtocol()` Return the protocol to be used.
`String` `getReferrals()` Returns the current settings for handling JNDI referrals.
`String` `getRoleBase()` Return the base element for role searches.
`String` `getRoleName()` Return the role name attribute name for this Realm.
`boolean` `getRoleNested()` Return the "The nested group search flag" flag.
`protected List<String>` `getRoles(DirContext context, JNDIRealm.User user)` Return a List of roles associated with the given User.
`String` `getRoleSearch()` Return the message format pattern for selecting roles in this Realm.
`boolean` `getRoleSubtree()` Return the "search subtree for roles" flag.
`long` `getSizeLimit()`
`String` `getSpnegoDelegationQop()`
`int` `getTimeLimit()`
`protected JNDIRealm.User` `getUser(DirContext context, String username)` Return a User object containing information about the user with the specified username, if found in the directory; otherwise return `null`.
`protected JNDIRealm.User` `getUser(DirContext context, String username, String credentials)` Return a User object containing information about the user with the specified username, if found in the directory; otherwise return `null`.
`protected JNDIRealm.User` `getUser(DirContext context, String username, String credentials, int curUserPattern)` Return a User object containing information about the user with the specified username, if found in the directory; otherwise return `null`.
`String` `getUserBase()` Return the base element for user searches.
`protected JNDIRealm.User` `getUserByPattern(DirContext context, String username, String[] attrIds, String dn)` Use the distinguished name to locate the directory entry for the user with the specified username and return a User object; otherwise return `null`.
`protected JNDIRealm.User` `getUserByPattern(DirContext context, String username, String credentials, String[] attrIds, int curUserPattern)` Use the `UserPattern` configuration attribute to locate the directory entry for the user with the specified username and return a User object; otherwise return `null`.
`protected JNDIRealm.User` `getUserBySearch(DirContext context, String username, String[] attrIds)` Search the directory to return a User object containing information about the user with the specified username, if found in the directory; otherwise return `null`.
`String` `getUserPassword()` Return the password attribute used to retrieve the user password.
`String` `getUserPattern()` Return the message format pattern for selecting users in this Realm.
`String` `getUserRoleAttribute()`
`String` `getUserRoleName()` Return the user role name attribute name for this Realm.
`String` `getUserSearch()` Return the message format pattern for selecting users in this Realm.
`boolean` `getUserSubtree()` Return the "search subtree for users" flag.
`boolean` `isRoleSearchAsUser()`
`boolean` `isUseDelegatedCredential()`
`protected DirContext` `open()` Open (if necessary) and return a connection to the configured directory server for this Realm.
`protected String[]` `parseUserPatternString(String userPatternString)` Given a string containing LDAP patterns for user locations (separated by parentheses in a pseudo-LDAP search string format - "(location1)(location2)", returns an array of those paths.
`protected void` `release(DirContext context)` Release our use of this connection so that it can be recycled.
`void` `setAdCompat(boolean adCompat)` How do we handle PartialResultExceptions?
`void` `setAlternateURL(String alternateURL)` Setter for property alternateURL.
`void` `setAuthentication(String authentication)` Set the type of authentication to use.
`void` `setCommonRole(String commonRole)` Set the common role
`void` `setConnectionName(String connectionName)` Set the connection username for this Realm.
`void` `setConnectionPassword(String connectionPassword)` Set the connection password for this Realm.
`void` `setConnectionTimeout(String timeout)` Set the connection timeout.
`void` `setConnectionURL(String connectionURL)` Set the connection URL for this Realm.
`void` `setContextFactory(String contextFactory)` Set the JNDI context factory for this Realm.
`void` `setDerefAliases(String derefAliases)` Set the value for derefAliases to be used when searching the directory.
`void` `setProtocol(String protocol)` Set the protocol for this Realm.
`void` `setReferrals(String referrals)` How do we handle JNDI referrals?
`void` `setRoleBase(String roleBase)` Set the base element for role searches.
`void` `setRoleName(String roleName)` Set the role name attribute name for this Realm.
`void` `setRoleNested(boolean roleNested)` Set the "search subtree for roles" flag.
`void` `setRoleSearch(String roleSearch)` Set the message format pattern for selecting roles in this Realm.
`void` `setRoleSearchAsUser(boolean roleSearchAsUser)`
`void` `setRoleSubtree(boolean roleSubtree)` Set the "search subtree for roles" flag.
`void` `setSizeLimit(long sizeLimit)`
`void` `setSpnegoDelegationQop(String spnegoDelegationQop)`
`void` `setTimeLimit(int timeLimit)`
`void` `setUseDelegatedCredential(boolean useDelegatedCredential)`
`void` `setUserBase(String userBase)` Set the base element for user searches.
`void` `setUserPassword(String userPassword)` Set the password attribute used to retrieve the user password.
`void` `setUserPattern(String userPattern)` Set the message format pattern for selecting users in this Realm.
`void` `setUserRoleAttribute(String userRoleAttribute)`
`void` `setUserRoleName(String userRoleName)` Set the user role name attribute name for this Realm.
`void` `setUserSearch(String userSearch)` Set the message format pattern for selecting users in this Realm.
`void` `setUserSubtree(boolean userSubtree)` Set the "search subtree for users" flag.
`protected void` `startInternal()` Prepare for the beginning of active use of the public methods of this component and implement the requirements of `LifecycleBase.startInternal()`.
`protected void` `stopInternal()` Gracefully terminate the active use of the public methods of this component and implement the requirements of `LifecycleBase.stopInternal()`.

### Methods inherited from class org.apache.catalina.realm.RealmBase

`addPropertyChangeListener, authenticate, authenticate, authenticate, backgroundProcess, compareCredentials, digest, Digest, findSecurityConstraints, getAllRolesMode, getContainer, getDigest, getDigest, getDigestCharset, getDigestEncoding, getDomainInternal, getObjectNameKeyProperties, getPrincipal, getRealmPath, getRealmSuffix, getServer, getValidate, getX509UsernameRetrieverClassName, hasMessageDigest, hasResourcePermission, hasRole, hasUserDataPermission, initInternal, isStripRealmForGss, main, removePropertyChangeListener, setAllRolesMode, setContainer, setDigest, setDigestEncoding, setRealmPath, setStripRealmForGss, setValidate, setX509UsernameRetrieverClassName, toString`

### Methods inherited from class org.apache.catalina.util.LifecycleMBeanBase

`destroyInternal, getDomain, getObjectName, postDeregister, postRegister, preDeregister, preRegister, register, setDomain, unregister`

### Methods inherited from class org.apache.catalina.util.LifecycleBase

`addLifecycleListener, destroy, findLifecycleListeners, fireLifecycleEvent, getState, getStateName, init, removeLifecycleListener, setState, setState, start, stop`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

### Field Detail

#### authentication

    protected String authentication

The type of authentication to use

#### connectionName

    protected String connectionName

The connection username for the server we will contact.

#### connectionPassword

    protected String connectionPassword

The connection password for the server we will contact.

#### connectionURL

    protected String connectionURL

The connection URL for the server we will contact.

#### context

    protected DirContext context

The directory context linking us to our directory server.

#### contextFactory

    protected String contextFactory

The JNDI context factory used to acquire our InitialContext. By default, assumes use of an LDAP server using the standard JNDI LDAP provider.

#### derefAliases

    protected String derefAliases

How aliases should be dereferenced during search operations.

#### DEREF_ALIASES

    public static final String DEREF_ALIASES

Constant that holds the name of the environment property for specifying the manner in which aliases should be dereferenced.

See Also:
  Constant Field Values

#### info

    protected static final String info

Descriptive information about this Realm implementation.

See Also:
  Constant Field Values

#### name

    protected static final String name

Descriptive information about this Realm implementation.

See Also:
  Constant Field Values

#### protocol

    protected String protocol

The protocol that will be used in the communication with the directory server.

#### adCompat

    protected boolean adCompat

Should we ignore PartialResultExceptions when iterating over NamingEnumerations? Microsoft Active Directory often returns referrals, which lead to PartialResultExceptions. Unfortunately there's no stable way to detect, if the Exceptions really come from an AD referral. Set to true to ignore PartialResultExceptions.

#### referrals

    protected String referrals

How should we handle referrals? Microsoft Active Directory often returns referrals. If you need to follow them set referrals to "follow". Caution: if your DNS is not part of AD, the LDAP client lib might try to resolve your domain name in DNS to find another LDAP server.

#### userBase

    protected String userBase

The base element for user searches.

#### userSearch

    protected String userSearch

The message format used to search for a user, with "{0}" marking the spot where the username goes.

#### userSearchFormat

    protected MessageFormat userSearchFormat

The MessageFormat object associated with the current `userSearch`.

#### userSubtree

    protected boolean userSubtree

Should we search the entire subtree for matching users?

#### userPassword

    protected String userPassword

The attribute name used to retrieve the user password.

#### userRoleAttribute

    protected String userRoleAttribute

The name of the attribute inside the users directory entry where the value will be taken to search for roles This attribute is not used during a nested search

#### userPatternArray

    protected String[] userPatternArray

A string of LDAP user patterns or paths, ":"-separated These will be used to form the distinguished name of a user, with "{0}" marking the spot where the specified username goes. This is similar to userPattern, but allows for multiple searches for a user.

#### userPattern

    protected String userPattern

The message format used to form the distinguished name of a user, with "{0}" marking the spot where the specified username goes.

#### userPatternFormatArray

    protected MessageFormat[] userPatternFormatArray

An array of MessageFormat objects associated with the current `userPatternArray`.

#### roleBase

    protected String roleBase

The base element for role searches.

#### roleBaseFormat

    protected MessageFormat roleBaseFormat

The MessageFormat object associated with the current `roleBase`.

#### roleFormat

    protected MessageFormat roleFormat

The MessageFormat object associated with the current `roleSearch`.

#### userRoleName

    protected String userRoleName

The name of an attribute in the user's entry containing roles for that user

#### roleName

    protected String roleName

The name of the attribute containing roles held elsewhere

#### roleSearch

    protected String roleSearch

The message format used to select roles for a user, with "{0}" marking the spot where the distinguished name of the user goes. The "{1}" and "{2}" are described in the Configuration Reference.

#### roleSubtree

    protected boolean roleSubtree

Should we search the entire subtree for matching memberships?

#### roleNested

    protected boolean roleNested

Should we look for nested group in order to determine roles?

#### roleSearchAsUser

    protected boolean roleSearchAsUser

When searching for user roles, should the search be performed as the user currently being authenticated? If false, `connectionName` and `connectionPassword` will be used if specified, else an anonymous connection will be used.

#### alternateURL

    protected String alternateURL

An alternate URL, to which, we should connect if connectionURL fails.

#### connectionAttempt

    protected int connectionAttempt

The number of connection attempts. If greater than zero we use the alternate url.

#### commonRole

    protected String commonRole

Add this role to every authenticated user

#### connectionTimeout

    protected String connectionTimeout

The timeout, in milliseconds, to use when trying to create a connection to the directory. The default is 5000 (5 seconds).

#### sizeLimit

    protected long sizeLimit

The sizeLimit (also known as the countLimit) to use when the realm is configured with `userSearch`. Zero for no limit.

#### timeLimit

    protected int timeLimit

The timeLimit (in milliseconds) to use when the realm is configured with `userSearch`. Zero for no limit.

#### useDelegatedCredential

    protected boolean useDelegatedCredential

Should delegated credentials from the SPNEGO authenticator be used if available

#### spnegoDelegationQop

    protected String spnegoDelegationQop

The QOP that should be used for the connection to the LDAP server after authentication. This value is used to set the `javax.security.sasl.qop` environment property for the LDAP connection.

### Constructor Detail

#### JNDIRealm

    public JNDIRealm()

### Method Detail

#### getAuthentication

    public String getAuthentication()

Return the type of authentication to use.

#### setAuthentication

    public void setAuthentication(String authentication)

Set the type of authentication to use.

Parameters:
  `authentication` - The authentication

#### getConnectionName

    public String getConnectionName()

Return the connection username for this Realm.

#### setConnectionName

    public void setConnectionName(String connectionName)

Set the connection username for this Realm.

Parameters:
  `connectionName` - The new connection username

#### getConnectionPassword

    public String getConnectionPassword()

Return the connection password for this Realm.

#### setConnectionPassword

    public void setConnectionPassword(String connectionPassword)

Set the connection password for this Realm.

Parameters:
  `connectionPassword` - The new connection password

#### getConnectionURL

    public String getConnectionURL()

Return the connection URL for this Realm.

#### setConnectionURL

    public void setConnectionURL(String connectionURL)

Set the connection URL for this Realm.

Parameters:
  `connectionURL` - The new connection URL

#### getContextFactory

    public String getContextFactory()

Return the JNDI context factory for this Realm.

#### setContextFactory

    public void setContextFactory(String contextFactory)

Set the JNDI context factory for this Realm.

Parameters:
  `contextFactory` - The new context factory

#### getDerefAliases

    public String getDerefAliases()

Return the derefAliases setting to be used.

#### setDerefAliases

    public void setDerefAliases(String derefAliases)

Set the value for derefAliases to be used when searching the directory.

Parameters:
  `derefAliases` - New value of property derefAliases.

#### getProtocol

    public String getProtocol()

Return the protocol to be used.

#### setProtocol

    public void setProtocol(String protocol)

Set the protocol for this Realm.

Parameters:
  `protocol` - The new protocol.

#### getAdCompat

    public boolean getAdCompat()

Returns the current settings for handling PartialResultExceptions

#### setAdCompat

    public void setAdCompat(boolean adCompat)

How do we handle PartialResultExceptions? True: ignore all PartialResultExceptions.

#### getReferrals

    public String getReferrals()

Returns the current settings for handling JNDI referrals.

#### setReferrals

    public void setReferrals(String referrals)

How do we handle JNDI referrals? ignore, follow, or throw (see javax.naming.Context.REFERRAL for more information).

#### getUserBase

    public String getUserBase()

Return the base element for user searches.

#### setUserBase

    public void setUserBase(String userBase)

Set the base element for user searches.

Parameters:
  `userBase` - The new base element

#### getUserSearch

    public String getUserSearch()

Return the message format pattern for selecting users in this Realm.

#### setUserSearch

    public void setUserSearch(String userSearch)

Set the message format pattern for selecting users in this Realm.

Parameters:
  `userSearch` - The new user search pattern

#### getUserSubtree

    public boolean getUserSubtree()

Return the "search subtree for users" flag.

#### setUserSubtree

    public void setUserSubtree(boolean userSubtree)

Set the "search subtree for users" flag.

Parameters:
  `userSubtree` - The new search flag

#### getUserRoleName

    public String getUserRoleName()

Return the user role name attribute name for this Realm.

#### setUserRoleName

    public void setUserRoleName(String userRoleName)

Set the user role name attribute name for this Realm.

Parameters:
  `userRoleName` - The new userRole name attribute name

#### getRoleBase

    public String getRoleBase()

Return the base element for role searches.

#### setRoleBase

    public void setRoleBase(String roleBase)

Set the base element for role searches.

Parameters:
  `roleBase` - The new base element

#### getRoleName

    public String getRoleName()

Return the role name attribute name for this Realm.

#### setRoleName

    public void setRoleName(String roleName)

Set the role name attribute name for this Realm.

Parameters:
  `roleName` - The new role name attribute name

#### getRoleSearch

    public String getRoleSearch()

Return the message format pattern for selecting roles in this Realm.

#### setRoleSearch

    public void setRoleSearch(String roleSearch)

Set the message format pattern for selecting roles in this Realm.

Parameters:
  `roleSearch` - The new role search pattern

#### isRoleSearchAsUser

    public boolean isRoleSearchAsUser()

#### setRoleSearchAsUser

    public void setRoleSearchAsUser(boolean roleSearchAsUser)

#### getRoleSubtree

    public boolean getRoleSubtree()

Return the "search subtree for roles" flag.

#### setRoleSubtree

    public void setRoleSubtree(boolean roleSubtree)

Set the "search subtree for roles" flag.

Parameters:
  `roleSubtree` - The new search flag

#### getRoleNested

    public boolean getRoleNested()

Return the "The nested group search flag" flag.

#### setRoleNested

    public void setRoleNested(boolean roleNested)

Set the "search subtree for roles" flag.

Parameters:
  `roleNested` - The nested group search flag

#### getUserPassword

    public String getUserPassword()

Return the password attribute used to retrieve the user password.

#### setUserPassword

    public void setUserPassword(String userPassword)

Set the password attribute used to retrieve the user password.

Parameters:
  `userPassword` - The new password attribute

#### getUserRoleAttribute

    public String getUserRoleAttribute()

#### setUserRoleAttribute

    public void setUserRoleAttribute(String userRoleAttribute)

#### getUserPattern

    public String getUserPattern()

Return the message format pattern for selecting users in this Realm.

#### setUserPattern

    public void setUserPattern(String userPattern)

Set the message format pattern for selecting users in this Realm. This may be one simple pattern, or multiple patterns to be tried, separated by parentheses. (for example, either "cn={0}", or "(cn={0})(cn={0},o=myorg)" Full LDAP search strings are also supported, but only the "OR", "|" syntax, so "(|(cn={0})(cn={0},o=myorg))" is also valid. Complex search strings with &, etc are NOT supported.

Parameters:
  `userPattern` - The new user pattern

#### getAlternateURL

    public String getAlternateURL()

Getter for property alternateURL.

Returns:
  Value of property alternateURL.

#### setAlternateURL

    public void setAlternateURL(String alternateURL)

Setter for property alternateURL.

Parameters:
  `alternateURL` - New value of property alternateURL.

#### getCommonRole

    public String getCommonRole()

Return the common role

#### setCommonRole

    public void setCommonRole(String commonRole)

Set the common role

Parameters:
  `commonRole` - The common role

#### getConnectionTimeout

    public String getConnectionTimeout()

Return the connection timeout.

#### setConnectionTimeout

    public void setConnectionTimeout(String timeout)

Set the connection timeout.

Parameters:
  `timeout` - The new connection timeout

#### getSizeLimit

    public long getSizeLimit()

#### setSizeLimit

    public void setSizeLimit(long sizeLimit)

#### getTimeLimit

    public int getTimeLimit()

#### setTimeLimit

    public void setTimeLimit(int timeLimit)

#### isUseDelegatedCredential

    public boolean isUseDelegatedCredential()

#### setUseDelegatedCredential

    public void setUseDelegatedCredential(boolean useDelegatedCredential)

#### getSpnegoDelegationQop

    public String getSpnegoDelegationQop()

#### setSpnegoDelegationQop

    public void setSpnegoDelegationQop(String spnegoDelegationQop)

#### getInfo

    public String getInfo()

Return descriptive information about this Realm implementation and the corresponding version number, in the format `<description>/<version>`.

Specified by:
  `getInfo` in interface `Realm`
Overrides:
  `getInfo` in class `RealmBase`

#### authenticate

    public Principal authenticate(String username,
                         String credentials)

Return the Principal associated with the specified username and credentials, if there is one; otherwise return `null`. If there are any errors with the JDBC connection, executing the query or anything we return null (don't authenticate). This event is also logged, and the connection will be closed so that a subsequent request will automatically re-open it.

Specified by:
  `authenticate` in interface `Realm`
Overrides:
  `authenticate` in class `RealmBase`
Parameters:
  `username` - Username of the Principal to look up
  `credentials` - Password or other credentials to use in authenticating this username

#### authenticate

    public Principal authenticate(DirContext context,
                         String username,
                         String credentials)
                           throws NamingException

Return the Principal associated with the specified username and credentials, if there is one; otherwise return `null`.

Parameters:
  `context` - The directory context
  `username` - Username of the Principal to look up
  `credentials` - Password or other credentials to use in authenticating this username
Throws:
  `NamingException` - if a directory server error occurs

#### getUser

    protected JNDIRealm.User getUser(DirContext context,
                         String username)
                              throws NamingException

Return a User object containing information about the user with the specified username, if found in the directory; otherwise return `null`.

Parameters:
  `context` - The directory context
  `username` - Username to be looked up
Throws:
  `NamingException` - if a directory server error occurs
See Also:
  `getUser(DirContext, String, String, int)`

#### getUser

    protected JNDIRealm.User getUser(DirContext context,
                         String username,
                         String credentials)
                              throws NamingException

Return a User object containing information about the user with the specified username, if found in the directory; otherwise return `null`.

Parameters:
  `context` - The directory context
  `username` - Username to be looked up
  `credentials` - User credentials (optional)
Throws:
  `NamingException` - if a directory server error occurs
See Also:
  `getUser(DirContext, String, String, int)`

#### getUser

    protected JNDIRealm.User getUser(DirContext context,
                         String username,
                         String credentials,
                         int curUserPattern)
                              throws NamingException

Return a User object containing information about the user with the specified username, if found in the directory; otherwise return `null`. If the `userPassword` configuration attribute is specified, the value of that attribute is retrieved from the user's directory entry. If the `userRoleName` configuration attribute is specified, all values of that attribute are retrieved from the directory entry.

Parameters:
  `context` - The directory context
  `username` - Username to be looked up
  `credentials` - User credentials (optional)
  `curUserPattern` - Index into userPatternFormatArray
Throws:
  `NamingException` - if a directory server error occurs

#### getUserByPattern

    protected JNDIRealm.User getUserByPattern(DirContext context,
                                  String username,
                                  String[] attrIds,
                                  String dn)
                                       throws NamingException

Use the distinguished name to locate the directory entry for the user with the specified username and return a User object; otherwise return `null`.

Parameters:
  `context` - The directory context
  `username` - The username
  `attrIds` - String[]containing names of attributes to
  `dn` - Distinguished name of the user retrieve.
Throws:
  `NamingException` - if a directory server error occurs

#### getUserByPattern

    protected JNDIRealm.User getUserByPattern(DirContext context,
                                  String username,
                                  String credentials,
                                  String[] attrIds,
                                  int curUserPattern)
                                       throws NamingException

Use the `UserPattern` configuration attribute to locate the directory entry for the user with the specified username and return a User object; otherwise return `null`.

Parameters:
  `context` - The directory context
  `username` - The username
  `credentials` - User credentials (optional)
  `attrIds` - String[]containing names of attributes to
  `curUserPattern` - Index into userPatternFormatArray
Throws:
  `NamingException` - if a directory server error occurs
See Also:
  `getUserByPattern(DirContext, String, String[], String)`

#### getUserBySearch

    protected JNDIRealm.User getUserBySearch(DirContext context,
                                 String username,
                                 String[] attrIds)
                                      throws NamingException

Search the directory to return a User object containing information about the user with the specified username, if found in the directory; otherwise return `null`.

Parameters:
  `context` - The directory context
  `username` - The username
  `attrIds` - String[]containing names of attributes to retrieve.
Throws:
  `NamingException` - if a directory server error occurs

#### checkCredentials

    protected boolean checkCredentials(DirContext context,
                           JNDIRealm.User user,
                           String credentials)
                                throws NamingException

Check whether the given User can be authenticated with the given credentials. If the `userPassword` configuration attribute is specified, the credentials previously retrieved from the directory are compared explicitly with those presented by the user. Otherwise the presented credentials are checked by binding to the directory as the user.

Parameters:
  `context` - The directory context
  `user` - The User to be authenticated
  `credentials` - The credentials presented by the user
Throws:
  `NamingException` - if a directory server error occurs

#### compareCredentials

    protected boolean compareCredentials(DirContext context,
                             JNDIRealm.User info,
                             String credentials)
                                  throws NamingException

Check whether the credentials presented by the user match those retrieved from the directory.

Parameters:
  `context` - The directory context
  `info` - The User to be authenticated
  `credentials` - Authentication credentials
Throws:
  `NamingException` - if a directory server error occurs

#### bindAsUser

    protected boolean bindAsUser(DirContext context,
                     JNDIRealm.User user,
                     String credentials)
                          throws NamingException

Check credentials by binding to the directory as the user

Parameters:
  `context` - The directory context
  `user` - The User to be authenticated
  `credentials` - Authentication credentials
Throws:
  `NamingException` - if a directory server error occurs

#### getRoles

    protected List<String> getRoles(DirContext context,
                        JNDIRealm.User user)
                             throws NamingException

Return a List of roles associated with the given User. Any roles present in the user's directory entry are supplemented by a directory search. If no roles are associated with this user, a zero-length List is returned.

Parameters:
  `context` - The directory context we are searching
  `user` - The User to be checked
Throws:
  `NamingException` - if a directory server error occurs

#### close

    protected void close(DirContext context)

Close any open connection to the directory server for this Realm.

Parameters:
  `context` - The directory context to be closed

#### getName

    protected String getName()

Return a short name for this Realm implementation.

Specified by:
  `getName` in class `RealmBase`

#### getPassword

    protected String getPassword(String username)

Return the password associated with the given principal's user name.

Specified by:
  `getPassword` in class `RealmBase`

#### getPrincipal

    protected Principal getPrincipal(String username)

Return the Principal associated with the given user name.

Specified by:
  `getPrincipal` in class `RealmBase`

#### getPrincipal

    protected Principal getPrincipal(String username,
                         GSSCredential gssCredential)

Overrides:
  `getPrincipal` in class `RealmBase`

#### getPrincipal

    protected Principal getPrincipal(DirContext context,
                         String username,
                         GSSCredential gssCredential)
                              throws NamingException

Return the Principal associated with the given user name.

Throws:
  `NamingException`

#### open

    protected DirContext open()
                       throws NamingException

Open (if necessary) and return a connection to the configured directory server for this Realm.

Throws:
  `NamingException` - if a directory server error occurs

#### getDirectoryContextEnvironment

    protected Hashtable<String,String> getDirectoryContextEnvironment()

Create our directory context configuration.

Returns:
  java.util.Hashtable the configuration for the directory context.

#### release

    protected void release(DirContext context)

Release our use of this connection so that it can be recycled.

Parameters:
  `context` - The directory context to release

#### startInternal

    protected void startInternal()
                          throws LifecycleException

Prepare for the beginning of active use of the public methods of this component and implement the requirements of `LifecycleBase.startInternal()`.

Overrides:
  `startInternal` in class `RealmBase`
Throws:
  `LifecycleException` - if this component detects a fatal error that prevents this component from being used

#### stopInternal

    protected void stopInternal()
                         throws LifecycleException

Gracefully terminate the active use of the public methods of this component and implement the requirements of `LifecycleBase.stopInternal()`.

Overrides:
  `stopInternal` in class `RealmBase`
Throws:
  `LifecycleException` - if this component detects a fatal error that needs to be reported

#### parseUserPatternString

    protected String[] parseUserPatternString(String userPatternString)

Given a string containing LDAP patterns for user locations (separated by parentheses in a pseudo-LDAP search string format - "(location1)(location2)", returns an array of those paths. Real LDAP search strings are supported as well (though only the "|" "OR" type).

Parameters:
  `userPatternString` - - a string LDAP search paths surrounded by parentheses

#### doRFC2254Encoding

    protected String doRFC2254Encoding(String inString)

Given an LDAP search string, returns the string with certain characters escaped according to RFC 2254 guidelines. The character mapping is as follows: char -> Replacement --------------------------- * -> \2a ( -> \28 ) -> \29 \ -> \5c \0 -> \00

Parameters:
  `inString` - string to escape according to RFC 2254 guidelines
Returns:
  String the escaped/encoded result

#### getDistinguishedName

    protected String getDistinguishedName(DirContext context,
                              String base,
                              SearchResult result)
                                   throws NamingException

Returns the distinguished name of a search result.

Parameters:
  `context` - Our DirContext
  `base` - The base DN
  `result` - The search result
Returns:
  String containing the distinguished name
Throws:
  `NamingException`