This document specifies guidelines that developers creating LDAP service
providers and service providers that support LDAP-like features should
follow. By following these guidelines, developers can produce implementations
that JNDI API users can configure and use with minimal differences.
Not all of the features described in this document must be supported
by an LDAP service provider. However, if a feature is supported, it should
be supported in the way described by this document.
2. Conformance
An LDAP service provider that supports LDAP version 3 (LDAPv3) conforms
to:
Environment properties are the means by which JNDI application users configure
and affect the behavior of JNDI service providers. Consequently, service
providers must interpret and handle environment properties in the same
way.
There are four types of environment properties that affect LDAP
service providers:
When creating an initial context, environment properties can be passed
as an argument to the constructor or may be initialized as specified in the
JNDI documentation.
In particular, if any of the following properties is not supplied in
the environment properties then it is sought from the system properties,
applet parameters, and both provider and application resource files (in
that order):
In the case of the control, object and state factory properties,
if more than one occurrence of the property is located,
then its values are concatenated into a single list.
In the case of the url property and all other
properties, only the first occurrence is used.
A context's environment properties can be examined using the Context.getEnvironment
method.
With the exception of the
java.naming.provider.url
and
java.naming.factory.initial
properties, changing a property using the Context.addToEnvironment
or Context.removeFromEnvironment
methods affects the context instance on which the method is invoked. For
example, if you specify new credentials for a context to use, subsequent
methods invoked on that context that require communication with the server
will use those new credentials (perhaps internally by first creating a
new connection to the server). These updated environment properties are
inherited by context instances that are subsequently derived from the affected
context instance, but do not otherwise affect other context instances that
were in existence prior to the update.
3.1.4 Timeliness
When a change is made to the environment properties, there is no requirement
that the change be verified and acted upon at the time the Context.addToEnvironment
or Context.removeFromEnvironment
method is invoked. The only requirement is that the change (or changes)
be effective the next time an operation that uses that property is invoked.
3.1.5 Defaults
This specification defines defaults for the environment properties. In
a few cases, the default is determined by the service provider. If a context
does not have a particular environment property, it behaves as if it has
that environment property with its default value.
When a property is removed from the environment properties of a context,
the context assumes the default behavior specified for that property. This
does not necessarily mean that the default value must be recorded as the
property's value. The removal may also be indicated by the absence of the
property from the context's environment properties.
3.1.6 Acceptable Values
This specification defines acceptable values for the environment properties.
Some environment properties have a fixed set of acceptable values while
others have values that must follow a particular syntax. If an unacceptable
value is presented, a property-specific exception will be thrown (for example,
ConfigurationException,
IllegalArgumentException,
or AuthenticationNotSupportedException).
In some cases, it might
be reasonable for the service provider to accept additional values than
those specified, in which case, those values should be documented.
3.2 JNDI Properties
LDAP service providers should process the JNDI environment properties according
to the following specifications. In the examples given, env is
an instance of Hashtable
that holds the environment properties used to create an initial context.
java.naming.batchsize
The value of this property is a string of decimal digits that
specifies the batch size of search results returned by the server.
This property affects the blocking behaviour of the Context.list,
Context.listBindings,
and DirContext.search methods and the NamingEnumeration
objects that they return. It does not affect how many items are returned
in the enumeration; it only affects how the items are batched or read at
the LDAP protocol level.
A setting of zero means that the provider should block until all results
have been received. A setting of an integer n greater than zero
means that the provider should block until n results have been received
from the server or until the enumeration terminates, whichever produces
the fewer number of results. After the application has read
n results
(using NamingEnumeration.next or NamingEnumeration.nextElement),
the provider should read n more results from the server or until
the enumeration terminates, whichever produces the fewer number of results.
If this property is not set then its default value is implementation-specific.
specifies that the provider should block until 24 entries have been read
from the server or until the enumeration terminates, whichever produces
the fewer number of results.
java.naming.factory.control
The value of this property is a colon-separated list of fully
qualified class names of control factory classes.
The factories are responsible for narrowing the class of response
controls. They create specific response controls from the generic response
controls generated by the provider.
sets the ResponseControlFactory class as the control factory to
try.
java.naming.factory.initial
The value of this property is the fully qualified class name
of the factory class which creates the initial context for the LDAP service
provider.
It is used to select a particular LDAP service provider; it's not actually
used by the provider itself. This property need not be set when the name
argument to initial context methods is a URL.
The value of this property is a colon-separated list of fully
qualified class names of object factory classes.
The factories are responsible for creating specific objects from the
LDAP entries returned by the provider. For example, a Person object factory
might generate a Person object from an LDAP entry of object class
person. Object factories behave in the opposite way to state
factories in that they generate objects from LDAP attributes.
sets the PersonFromLDAP class as the object factory to try.
java.naming.factory.state
The value of this property is a colon-separated list of fully
qualified class names of state factory classes.
The factories are responsible for creating an object's state (for storing)
from the object itself. For example, a Person state factory might generate
an LDAP entry of object class person from a Person object. State
factories behave in the opposite way to object factories
in that they generate LDAP attributes from objects.
sets the PersonToLDAP class as the state factory to try.
java.naming.language
The value of this property is a string language tag according
to RFC 1766.
This property indicates a preference for a particular natural language.
A provider may adjust its LDAP requests and responses according to the
value of this property.
The affect of this property is implementation-specific. No default value
is defined.
The value of this property is a list of space-separated
LDAP or LDAPS URL strings, each of which specifies the
hostname and port number of the LDAP server, and the root distinguished
name of the naming context to use. An LDAP URL specifies the use
of a plain (i.e., unprotected) connection; an LDAPS URL specifies the
use of an SSL connection. If the list contains more than
one URL, the provider should attempt to use each URL in turn until it
is able to create a successful connection, and
after creation, set the property to the successful URL.
The default hostname is localhost; the default port is
389 for plain connections and 636 for SSL connections.
The default root distinguished name is the empty
string. If this property is not set, or if either the hostname or
port number is omitted, then the default values are used in place of
the missing information. If both the hostname and port are missing
but a non-empty distinguished name is present in the URL, then the
provider should use the distinguished name to determine the hostname
and port of the LDAP server(s) as described in the URLs section and when a connection
has been established successfully, set the
java.naming.provider.url property to a URL constructed
using the successful hostname, port and distinguished name. See also
the URLs section for information on how
the provider should treat other information found in the URL.
The value of this property is a string that specifies how referrals
shall be handled by the provider. The following values are defined for
this property:
ignore referrals if they appear in results. A PartialResultException
is thrown to indicate an incomplete result. In addition, for LDAPv3 servers,
the provider shall request that referrals be treated as ordinary attributes
when they appear in entries. This is achieved by sending a non-critical
ManageDsaIT (RFC 3296)
LDAP control with each LDAP request. LDAP servers which do not support
this LDAP control will simply ignore it and process the request as normal.
See the URLs section for information on how to treat
multiple URLs found in a single referral entry.
If this property is not set then its default value is ignore.
specifies that referrals encountered during an LDAP operation should throw
a ReferralException
to the application.
java.naming.security.authentication
The value of this property is a string that specifies the authentication
mechanism(s) for the provider to use. The following values are defined
for this property:
none
use no authentication (anonymous bind).
simple
use simple authentication (a cleartext password).
A space-separated list of one or more SASL mechanism names:
use the first available SASL mechanism in the list that conforms to the specified policy requirements
See the SASL section for information on how this property
is used for SASL authentication. See RFC 2829
for information on LDAP authentication mechanisms.
If this property is not set then its default value is none,
unless the java.naming.security.credentials
property is set, in which case the default value is simple. If
this property is set to a value that the provider does not recognize or
support, it should throw AuthenticationNotSupportedException.
specifies that DIGEST-MD5 authentication be used and, if that SASL mechanism
is unavailable, that CRAM-MD5 authentication be used. If neither is available
then throw AuthenticationNotSupportedException.
java.naming.security.credentials
The value of this property is an object that specifies the credentials
of the principal to be authenticated. Its format and handling depends on
the value of the java.naming.security.authentication
property.
For anonymous binds, this property is ignored - an empty string is always
used for the credentials. For simple authentication and SASL authentication
that requires a password, the value of this property may
be supplied as a java.lang.String, a char[] or a byte[].
If it is a String or a char[] then it is encoded into
a byte array using UTF-8 in the case of LDAPv3 and encoded using ISO-Latin-1
in the case of LDAPv2. If it is a byte[] then it is used as is.
See the SASL section for information on how this property is
used for SASL authentication.
The value of this property is a string that specifies the identity
of the principal to be authenticated. Its format depends on
the authentication type; see
RFC 2829
for more information.
The value is used as the name component in an LDAP ASN.1 BindRequest
for non-SASL authentication. For SASL authentication, the value of this
property is used as the authentication ID for SASL mechanisms that need
an authentication ID.
The provider is not required to verify the validity of the principal
name. It may, for example, just pass the string to be verified by the server.
If the principal identified is not a valid principal then the provider
shall throw an AuthenticationException.
sets the principal name to be the distinguished name "cn=admin, o=sun,
c=us".
java.naming.security.protocol
The value of this property is a string that specifies the security
protocol for the provider to use. The following value is defined for this
property:
ssl
use Secure Sockets Layer version 3.0.
If this property is set to ssl, the provider must use SSL
sockets, or throw ConfigurationException if it is unable to do
so. In addition to the value listed above, a provider may support other
security protocols. However, such provider-specific protocols might not
be supported by all providers. If this property is set to a security protocol
that the provider does not recognize or support, it should throw
ConfigurationException.
If the java.naming.ldap.factory.socket
property is set, then the socket factory identified by that property must
create sockets that are appropriate for this protocol setting. For example,
if the security protocol is set to ssl, then the socket factory
must create SSL-compliant sockets.
If this property is not set then the default is to use no security protocol.
As a developer of the LDAP provider, you should be aware that using
SSL to connect to a server on a port that is not listening for SSL connections
causes the socket to hang. Similarly, using a plain socket to connect to
a server that is listening for SSL connections also leads to hanging. This
is a characteristic of the protocol that some implementations may choose
to correct but is not otherwise required to do so. The provider's documentation,
however, should describe this behavior to its users. See SSL
for information on how to use SSL.
specifies that SSL-compliant sockets be used to communicate with the server.
3.3 LDAP-specific Properties
LDAP-specific properties are environment properties that apply to LDAP
service providers in general. These properties' names have the prefix "java.naming.ldap.".
The following table lists LDAP-specific properties that have been defined
so far. If there is a property that you feel belongs on this list, please
send a description of it to
jndi@java.sun.com.
java.naming.ldap.attributes.binary
The value of this property is a string of space-separated attribute
names. It specifies attributes which have non-string syntax. It extends
the provider's built-in list of non-string attributes (below). The
value of an attribute that has non-string syntax is returned as a byte array
(byte[]) instead of a String.
No default is defined. If this property is not set then only the following
attributes are considered to have non-string syntax:
informs the provider to return values of the
mpegVideo and myspecialkey attributes as byte[].
java.naming.ldap.control.connect
The value of this property is a Control[] object. It
sets the connection request controls that are active on a connection. See
LdapContext.
No default value is defined for this property.
For example:
env.put("java.naming.ldap.control.connect",
new Control[]{ new ManageReferralControl(true) });
sets a critical ManageDsaIT LDAP control as the connection request control.
java.naming.ldap.deleteRDN
The value of this property is a string that specifies whether the old
RDN is removed by the Context.rename
method. The following values are defined for this property:
true
delete the old RDN from the entry during the rename operation.
false
retain the old RDN as an attribute value of the entry.
If this property is not set then its default value is true.
For example:
env.put("java.naming.ldap.deleteRDN", "false");
causes the old RDN to be retained as an attribute of the renamed entry.
java.naming.ldap.derefAliases
The value of this property is a string that specifies how aliases
are dereferenced during search operations. The following values are defined
for this property:
always
always dereference aliases.
never
never dereference aliases.
finding
dereference aliases only during name resolution (that is, while locating
the target entry).
searching
dereference aliases once name resolution has completed (that is, after
locating the target entry).
If this property is not set then its default value is always.
In addition, if the java.naming.security.protocol
property is set, then the socket factory identified by this property must
create sockets which are appropriate for that protocol setting. For example,
if the security protocol is set to ssl then the socket factory must create
SSL-compliant sockets.
sets the socket factory of the provider to be javax.net.ssl.SSLSocketFactory.
java.naming.ldap.ref.separator
The value of this property is a string containing the character to
use when encoding a RefAddr
object in the javaReferenceAddress attribute (see Java
Objects).
This property is used to avoid a conflict in the case where the default
separator character appears in the components of a RefAddr
object.
If this property is not set then its default value is '#' (the
hash character).
For example:
env.put("java.naming.ldap.ref.separator", ":");
specifies that the separator ':' (the colon character) be used
when storing RefAddr
instances.
java.naming.ldap.referral.limit
The value of this property is a string of decimal digits specifying
the maximum number of referrals to follow in a chain of referrals. A setting
of zero indicates that there is no limit.
If this property is not set then the default value is 10.
For example:
env.put("java.naming.ldap.referral.limit", "5");
specifies that the referral limit is 5.
java.naming.ldap.typesOnly
The value of this property is a string that specifies whether only
attribute IDs are returned in results - attribute values are omitted. Affects
the SearchResult.getAttributes
and DirContext.getAttributes methods.
The following values are defined for this property:
true
return only attribute IDs.
false
return both attribute IDs and attribute values.
If this property is not set then its default value is false.
For example:
env.put("java.naming.ldap.typesOnly", "true");
causes the server to return attribute IDs but not attribute values.
java.naming.ldap.version
The value of this property is a string that specifies the protocol
version for the provider. The following values are defined for this property:
2
selects LDAP version 2 (LDAPv2).
3
selects LDAP version 3 (LDAPv3).
If this property is not set then the provider first attempts to
bind using LDAP v3 and fails over to using LDAP v2 if a protocol error
is received from the server. This failover mechanism is only used when
the java.naming.security.authentication
property indicates anonymous bind or simple authentication.
For example:
env.put("java.naming.ldap.version", "2");
requests the LDAP provider to communicate with the server using LDAPv2.
3.4 Feature-specific Properties
Feature-specific properties are environment properties which apply to a
particular feature which is supported by a provider.
The value of this property is a string that specifies the authorization
ID for the SASL mechanisms.
If this property is not set,
then the authorization ID passed to the SASL mechanisms
is the empty string.
According to SASL (RFC 2222),
using an authorization ID of the empty string directs the server
to derive an authorization ID from the client's authentication credentials.
specifies the identity to use for authorization (access control)
upon successful authentication.
java.naming.security.sasl.realm
The value of this property is a string that specifies the realm
information required by some SASL mechanisms such as DIGEST-MD5.
If this property is not set, then a mechanism-specific default
such as that negotiated between the client and server during the authentication
exchange is used.
specifies that the client wants to use the "webusers" realm for authentication.
java.naming.security.sasl.callback
The value of this property is an instance of
javax.security.auth.callback.CallbackHandler.
When the provider uses a SASL mechanism
that requires callbacks, the SASL mechanism uses the object supplied in
the property. The callback handler should satisfy a
NameCallback by supplying the authentication ID.
env.put("java.naming.security.sasl.callback",
new MyCallbackHandler());
supplies an instance of the callback handler for SASL mechanisms to use.
javax.security.sasl.qop
The value of this property is a ','-separated list
of quality-of-protection (qop) values used to specify the client's
qop preference. A qop value is one of
"auth" - authentication only
"auth-int" - authentication plus integrity protection
"auth-conf" - authentication plus integrity and confidentiality
protection
The order of the list specifies the preference order.
If this property is absent, the default qop is "auth".
javax.security.sasl.strength
The value of this property is a ','-separated list
of cipher strength values used to specify the client's
preference. A strength value is one of
"low"
"medium"
"high"
The order of the list specifies the preference order.
If this property is absent, the default strength is "high,medium,low".
For privacy in DIGEST-MD5, "high" maps to "3des",
"medium" to "rc4" or "des",
and "low" to "rc4-56" or "rc4-40".
javax.security.sasl.maxbuffer
The value of this property is the string representation of an integer that
specifies the maximum size of the receive buffer in bytes
that the client is willing to receive.
If this property is absent, the default size is defined by the SASL mechanism.
javax.security.sasl.server.authentication
The value of this property is either "true" or "false", specifying
whether the server must authenticate to the client or not, respectively.
If this property is absent, the default is "false".
javax.security.sasl.policy.forward
The value of this property is either "true" or "false", specifying
whether the selected SASL mechanism must support forward secrecy between sessions
or not, respectively.
If this property is absent, the default is "false".
javax.security.sasl.policy.credentials
The value of this property is either "true" or "false", specifying
whether the selected SASL mechanism must require client credentials
or not, respectively.
If this property is absent, the default is "false".
javax.security.sasl.policy.noplaintext
The value of this property is either "true" or "false", specifying
whether the selected SASL mechanism must not be susceptible to
simple plain passive attacks or not, respectively.
If this property is absent, the default is "false".
javax.security.sasl.policy.noactive
The value of this property is either "true" or "false", specifying
whether the selected SASL mechanism must not be susceptible to
active (non-dictionary) attacks or not, respectively.
If this property is absent, the default is "false".
javax.security.sasl.policy.nodictionary
The value of this property is either "true" or "false", specifying
whether the selected SASL mechanism must not be susceptible to
dictionary attacks or not, respectively.
If this property is absent, the default is "false".
javax.security.sasl.policy.noanonymous
The value of this property is either "true" or "false", specifying
whether the selected SASL mechanism must not accept
anonymous logins or not, respectively.
If this property is absent, the default is "false".
3.5 Provider-specific Properties
Provider-specific properties are environment properties which apply only
to particular provider implementations. The names of these properties are
chosen by the provider's implementor. The recommended policy for naming
these properties is to use the implementor's reversed DNS domain name to
prefix the provider's package name and to use that package name to prefix
the property name. For example, Sun prefixes its provider-specific LDAP
properties with "com.sun.jndi.ldap".
4. Names
Names are handled by the provider's context methods according to the following
rules:
String names supplied as parameters to the context methods are in the
composite name syntax.
The first component of the composite name is
an LDAP distinguished name
while the rest of the components are used for federation.
If a Name argument is a CompositeName object then its
first component is assumed to be an LDAP distinguished name and the remaining
components (if any) are used for federation.
If a Name argument is not a CompositeName object
then all of its components are assumed to be the parsed form of an LDAP
distinguished name. That is, each Name component is an LDAP relative
distinguished name (RDN).
Names are parsed using the name parser returned by the Context.getNameParser
method. The parser accepts LDAP distinguished names as String
objects and produces LDAP distinguished names as Name objects.
Names returned by context operations are string composite names or string URLs.
The syntax of string LDAP distinguished names follows RFC 2253.
For example:
CN=Steve Kille, O=Isode Limited, C=GB
OU=Sales+CN=J. Smith, O=Widget Inc., C=US
CN=L. Eagle, O=Sue\, Grabbit and Runn, C=GB
The name supplied to an LDAP context is always relative to that context.
For example, given an LDAP context (lctx) for "dc=widget,dc=com",
in order to name LDAP entries in that subtree, a name relative to "dc=widget,dc=com"
must be supplied. For example, the following call obtains the attributes
for the
"cn=John Smith,dc=widget,dc=com" entry,
Similarly, when a context is enumerated using any of the enumeration
methods (Context.list, Context.listBindings, DirContext.search),
the names returned are relative to the target context--the context being
enumerated. When referrals are invoked, instead of a relative name,
an LDAP or LDAPS URL string containing the fully qualified name is returned.
(If the enumeration was performed using a plain connection, an LDAP URL
string is returned; if it was done using an SSL connection, an LDAPS URL
string is returned.)
The
format of LDAP URLs is defined in RFC 2255.
LDAP URLs that follow RFC 2255
and LDAPS URLs
may be supplied to any of the context methods. The hostname and port number are
extracted from the URL and used to contact the LDAP server; the URL's scheme
("ldap" or "ldaps") is used to determine whether a plain or SSL connection
is used.
The java.naming.factory.initial
and java.naming.provider.url properties are
ignored. For example,
This code fragment contacts the LDAP server at machine wserver
at port 389 using a plain connection.
5. Attributes
The LDAP provider expects as input and returns as output all attribute
values as either String or byte[] objects. See
the
java.naming.ldap.attributes.binary
environment property for
which ones are treated as byte[] and how to extend the list.
6. URLs
RFC 2255 describes the
syntactic format of LDAP URLs. The format contains all the elements necessary
to specify an LDAP search operation, with provisions for supporting extensions:
Authentication information may be specified in the extensions
portion of the URL. See the RFC for a complete description of the format.
In addition to LDAP URLs, the provider may also support the non-standard
but widely used LDAPS URLs. LDAPS URLs use SSL connections instead of
plain (i.e., unprotected) connections. They have a syntax similar
to LDAP URLs except the schemes are different and the default
port for LDAPS URLs is 636 instead of 389.
To configure an LDAP service provider, you typically supply one
or more space-separated LDAP or LDAPS
URLs in the java.naming.provider.url property.
This is used by the LDAP service provider to configure its connection to
the directory server. Only the host, port, and dn
parts of the URL are relevant in this setting. Supplying other parts of
the URL results in a ConfigurationException.
Argument to initial context methods.
If a URL string (with syntax scheme_id:rest_of_name) is passed
to the methods in InitialContext, either as a String
argument or as the first component of Name, the URL's scheme id
is used to locate the context factory for handling that scheme. If none
is found, the URL string is treated as an ordinary name and passed to
the initial context specified by the
java.naming.factory.initial
property is used. See the java.naming.spi.NamingManager.getURLContext
method for details on how URL context factories are located.
Note that this support for URLs as names is only available in the initial
context.
With the exception of the search methods, when an LDAP or LDAPS URL
is passed as a name to the initial context, the URL should not contain
any query ('?') components. Otherwise, an InvalidNameException
is thrown by the service provider. For the search methods, the query
components of the URL override any corresponding components supplied as
arguments. For example, if an LDAP URL containing a scope component is
supplied, then that scope overrides any scope setting that may be passed
in a SearchControls argument.
Referrals.
An LDAP referral contains a list of one or more URLs. To process an
LDAP referral (either explicitly or implicitly by setting the
java.naming.referral
property), the service provider needs to use the information in the these
URLs to create connections to LDAP servers to which they refer. When multiple
URLs are present in a single referral they are treated as alternatives
and each is followed until one succeeds. The complete URL (that is, including
any query components) is used.
Returned as a name in list and search enumerations.
When the name of the entry being returned has a name that is not relative
to the target context (i.e., the starting context for the list or search),
the name is returned as a URL. See the NameClassPair.isRelative
method for details.
Argument to the getObjectInstance method of NamingManager
or DirectoryManager.
When an LDAP namespace is federated underneath another namespace (for
example, such as DNS), the information that is stored in the superior namespace
might be an LDAP or LDAPS URL. In such a scenario, a lookup/list/search operation
in the superior namespace would return a Reference containing
an LDAP or LDAPS URL for the LDAP namespace.
The service provider for the superior namespace would pass the Reference
to the getObjectInstance method to create an instance of an LDAP
context.
For items (1), (2), (3), and (5), if the URL is missing the hostname
and port but has a non-empty distinguished name,
the provider should use the algorithm
for discovering LDAP services with DNS as described in the Internet
draft
draft-ietf-ldapext-locate-08.txt.
If the provider does not use this algorithm, or if the DNS configuration
is not available, then the provider
should use localhost as the hostname,
and 389 as the port for plain connections, 636 as the port for SSL
connections.
7. Java Objects
7.1 Storing
The LDAP provider should support the storing of Java objects into the directory.
This is implemented in the following methods:
Context.bind()
Context.rebind()
DirContext.bind()
DirContext.rebind()
The provider should support at a minimum the storage of the following types
of Java objects:
Instances of Reference
Objects that implement the Referenceable interface
Objects that implement the Serializable interface
Objects that implement the DirContext interface
It should check whether an object is in these four categories in the order
listed because that is most likely to capture the intent of the client.
For example, a Reference is Serializable, so if you performed
the Serializable check first, no
References would ever
be stored in the reference format (that is, they would all be serialized).
References, referenceable and serializable objects should be stored
according to RFC 2713.
DirContext
objects should be stored by storing their attributes.
When storing a reference's
list of RefAddr into the
javaReferenceAddress attribute, the separator
to use for delimiting the address's position, type and content are controlled
using the environment property
java.naming.ldap.ref.separator.
If this environment property is not specified, the hash character '#'
should be used as the separator.
The provider uses the DirectoryManager.getStateToBind method
when storing objects in the directory. This allows objects of any type
to be transformed into one of the four categories listed above so that
they can be stored into the directory.
7.2 Reading
Objects are read from the directory using the following operations:
Context.lookup()
Context.lookupLink()
Binding.getObject()
When the provider reads an entry from the directory, it will get LDAP attributes,
and attributes defined in
RFC 2713
if the entry has an associated Java object. If the entry contains Java
object-related attributes, the provider should recreate the object using
those attributes. Otherwise, the provider should return an instance of
DirContext
containing the attributes of the entry. For both DirContext and
Java objects, the provider should then invoke DirectoryManager.getObjectInstance()
on it and return the result to the caller.
8.0 Schema
JNDI does not specify schema-related details such as structure and contents
of the schema tree, permission to modify to the contents of the schema
tree, and the effect of such modifications on the directory are dependent
on the underlying directory. JNDI specifies only that the root schema context--that
returned by
DirContext.getSchema()--contain the following bindings:
AttributeDefinition
ClassDefinition
SyntaxDefinition
This document specifies the structure and content of schema trees that
are derived from LDAP-based schemas. It describes how the schema tree is
laid out, and the mandatory and optional attributes that you can expect
to find associated with entries in different parts of this schema tree.
Permission to modify the contents of the schema tree is determined by
the directory administrator. When the schema tree is modified, the changes
are made to schema stored on the directory server.
8.1 Schema Tree Structure
In addition to the three bindings in the root schema context listed previously,
the root schema context may also contain the following four bindings:
Root of the SASL tree: a flat namespace with SASL authentication mechanisms
identified by their string name.
Any or all of these bindings may be absent if the underlying directory
does not publish such schema information, or the service provider does
not support retrieving them. If these names are present in the root schema
context, however, they must have the binding specified in the above table.
The attribute names and values of these entries' attributes are case-insensitive.
8.2 Attribute Definitions
The name "AttributeDefinition" is bound to a context containing
DirContext
objects representing attribute definitions in the schema. For example,
if a directory supports a "commonName" attribute, the "AttributeDefinition"
context would have a binding with name "commonName" that is bound to a
DirContext
object.
Each object in the "AttributeDefinition" context has the following mandatory
and optional attributes:
Attribute Identifier
Attribute Value Description
NUMERICOID (mandatory)
unique identifier (OID)
NAME
attribute's name
DESC
attribute's description
OBSOLETE
"true" if obsolete, "false" or absent otherwise
SUP
name of superior attribute type from which this attribute's type is
derived
EQUALITY
name or OID of matching rule if equality matching allowed, absent
otherwise
ORDERING
name or OID of matching rule if ordering matching allowed, absent otherwise
SUBSTRING
name or OID of matching rule if substring matching allowed, absent
otherwise
SYNTAX
numeric OID of syntax of values of this type
SINGLE-VALUE
"true" if attribute not multi-valued, "false" or absent otherwise.
COLLECTIVE
"true" if attribute is collective, "false" or absent otherwise.
NO-USER-MODIFICATION
"true" if not user-modifiable, "false" or absent otherwise.
USAGE
description of attribute usage
These attributes have a 1-to-1 correspondence with the names defined
in
RFC 2252 for "AttributeTypeDescription."
All the attribute values are represented by the java.lang.String
class.
You can, for example, obtain the object representing the "cn" attribute
using the following code:
DirContext schema = ctx.getSchema(""); // get schema tree
DirContext cnSchema = schema.lookup("AttributeDefinition/cn");
If you then get the attributes of the "cnSchema" DirContext object,
you would see:
NUMERICOID 2.5.4.3
NAME cn
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
DESC Standard Attribute, alias for commonName
An equivalent way of getting "cnSchema" is if you already have a "cn" attribute.
The following code illustrates this alternative:
The name "ClassDefinition" is bound to a context containing
DirContext
objects representing object class definitions in the schema. For example,
if a directory supports a "country" object class, the "ClassDefinition"
context would have a binding with name "country" that is bound to a DirContext
object.
Each object in the "ClassDefinition" context has the following mandatory
and optional attributes:
Attribute Identifier
Attribute Value Description
NUMERICOID (mandatory)
unique identifier (OID)
NAME
object class's name
DESC
object class's description
OBSOLETE
"true" if obsolete, "false" or absent otherwise
SUP
name of superior object class from which this object class is derived
ABSTRACT
"true" if object class is abstract, "false" or absent otherwise
STRUCTURAL
"true" if object class is structural, "false" or absent otherwise
AUXILIARY
"true" if object class is auxiliary, "false" or absent otherwise
MUST
a list of type names of attributes that must be present
MAY
a list of type names of attributes that may be present
These attributes have a 1-to-1 correspondence with the names defined
in RFC 2252 for "ObjectClassDescription."
All the attribute values are represented by the java.lang.String
class.
You can, for example, obtain the object representing the "country" object
class using the following code:
DirContext schema = ctx.getSchema(""); // get schema tree
DirContext countrySchema = schema.lookup("ClassDefinition/country");
If you then get the attributes of the "countrySchema" DirContext
object, you would see:
NUMERICOID 2.5.6.2
NAME country
MAY aci, searchguide, description
MUST objectclass, c
DESC Standard ObjectClass
SUP top
An equivalent way of getting "countrySchema" is if you already have a "country"
object. The following code illustrates this alternative:
// Read object from directory
DirContext countryObj = (DirContext)ctx.lookup("c=us", new String[]{"country"});
// Get all of object's object class definitions
DirContext objClasses = countryAttr.getSchemaClassDefinition();
// Pick out "country" object class in particular
DirContext countryClass = (DirContext)objClasses.lookup("country");
NOTE: JNDI 1.1's specification of
getSchemaClassDefinition()
implies that the service provider should return any one of an object's
object class definitions. This specification is inadequate because an object
usually has multiple object classes and the application might require knowledge
about any of those object classes depending on what it is doing. The proposal
as illustrated by the example above is to return a context containing all
of the object class definitions.
8.4 Syntax Definitions
The name "SyntaxDefinition" is bound to a context containing
DirContext
objects representing syntax definitions in the schema. For example, if
a directory supports the "1.3.6.1.4.1.1466.115.121.1.15" syntax (Directory
String) syntax, the "SyntaxDefinition" context would have a binding with
name "1.3.6.1.4.1.1466.115.121.1.15" that is bound to a DirContext
object.
Each object in "SyntaxDefinition" context has the following mandatory
and optional attributes:
Attribute Identifier
Attribute Value Description
NUMERICOID (mandatory)
unique identifier (OID)
DESC
syntax's description
These attributes have a 1-to-1 correspondence with the names defined
in RFC 2252 for "SyntaxDescription."
All the attribute values are represented by the java.lang.String
class.
You can, for example, obtain the object representing the "1.3.6.1.4.1.1466.115.121.1.15"
syntax using the following code:
DirContext schema = ctx.getSchema(""); // get schema tree
DirContext dirStringSchema =
schema.lookup("SyntaxDefinition/1.3.6.1.4.1.1466.115.121.1.15");
If you then get the attributes of the "dirStringSchema" DirContext
object, you would see:
An equivalent way of getting "dirStringSchema" is if you already have an
attribute that has that syntax (such as, the "country" attribute). The
following code illustrates this alternative:
The name "MatchingRule" is bound to a context containing DirContext
objects representing matching rules in the schema. A "matching rule" uniquely
identifies the algorithm to use when comparing attribute values. For example,
a directory might support a matching rule that is based on how a string
sounds and define it as the "soundAlikeMatch" matching rule. Then, the
"MatchingRule" context would have a binding with name "soundAlikeMatch"
that is bound to a
DirContext object.
When a matching rule is an extensible matching rule, it must also contain
an "APPLIES" attribute listing the attributes to which this extensible
matching rule can be applied.
Each object in "MatchingRule" context has the following mandatory and
optional attributes:
Attribute Identifier
Attribute Value Description
NUMERICOID (mandatory)
unique identifier (OID)
NAME
name of matching rule
DESC
matching rule's description
OBSOLETE
"true" if obsolete, "false" or absent otherwise
SYNTAX
numeric oid of syntax to which this rule applies
APPLIES
a list type names of attributes to which this extensible matching rule
applies
These attributes have a 1-to-1 correspondence with the names defined
in RFC 2252 for "MatchingRuleDescription"
and "MatchingRuleUseDescription." All the attribute values are represented
by the java.lang.String class.
You can, for example, obtain the object representing the "soundAlikeMatch"
syntax using the following code:
DirContext schema = ctx.getSchema(""); // get schema tree
DirContext soundMatchSchema =
schema.lookup("MatchingRule/soundAlikeMatch");
If you then get the attributes of the "soundMatchSchema" DirContext
object, you would see:
NUMERICOID 1.2.3.4.5
NAME soundAlikeMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 (for directory string)
APPLIES 2.5.4.41, 2.5.4.15
DESC Home-grown Phonetic match
8.6 Extension Definitions
The name "ExtensionDefinition" is bound to a context containing
DirContext
objects representing extensions supported by the server. For example, a
directory might support the "Start
TLS" extension ("1.3.6.1.4.1.1466.20037"). Then, the "ExtensionDefinition"
context would have a binding with name "1.3.6.1.4.1.1466.20037" that is
bound to a DirContext object.
Each object in "ExtensionDefinition" context has the following mandatory
and optional attributes:
Attribute Identifier
Attribute Value Description
NUMERICOID (mandatory)
unique identifier (OID)
DESC
extension's description
All the attribute values are represented by the java.lang.String
class.
You can, for example, obtain the object representing the Start TLS extension
("1.3.6.1.4.1.1466.20037") using the following code:
DirContext schema = ctx.getSchema(""); // get schema tree
DirContext startTLSSchema =
schema.lookup("ExtensionDefinition/1.3.6.1.4.1.1466.20037");
If you then get the attributes of the "startTLSSchema" DirContext
object, you would see:
NUMERICOID 1.3.6.1.4.1.1466.20037
DESC Start TLS (see RFC 2830)
8.7 Control Definitions
The name "ControlDefinition" is bound to a context containing
DirContext
objects representing controls supported by the server. For example, a directory
might support the control for asking the server to sort the search results
it returns.
Each object in "ControlDefinition" context has the following mandatory
and optional attributes:
Attribute Identifier
Attribute Value Description
NUMERICOID (mandatory)
unique identifier (string)
DESC
control's description
All the attribute values are represented by the java.lang.String
class.
You can, for example, obtain the object representing the server-side
sorting control ("1.2.840.113556.1.4.473") using the following code:
DirContext schema = ctx.getSchema(""); // get schema tree
DirContext svrSortSchema =
schema.lookup("ControlDefinition/1.2.840.113556.1.4.473");
If you then get the attributes of the "svrSortSchema" DirContext
object, you would see:
NUMERICOID 1.2.840.113556.1.4.473
DESC server-side sorting of search results
8.8 SASL Mechanisms
The name "SASLMechanism" is bound to a context containing
DirContext
objects representing SASL authentication mechanisms supported by the server.
For example, a directory might support the EXTERNAL SASL mechanism (RFC 2222)
which requests that the server make use of security credentials exchanged
by a lower layer.
Each object in "SASLMechanism" context has the following mandatory and
optional attributes:
Attribute Identifier
Attribute Value Description
NAME (mandatory)
SASL mechanism's name
DESC
SASL mechanism's description
All the attribute values are represented by the java.lang.String
class.
You can, for example, obtain the object representing the EXTERNAL SASL
mechanism using the following code:
DirContext schema = ctx.getSchema(""); // get schema tree
DirContext saslExternalSchema =
schema.lookup("SASLMechanism/EXTERNAL");
If you then get the attributes of the "saslExternalSchema" DirContext
object, you would see:
NAME EXTERNAL DESC EXTERNAL SASL mechanism (RFC 2222)
9. Exceptions
When building an LDAP provider, you need to translate LDAP error codes
(see
RFC 2251) into
JNDI exceptions. You should use the following table when performing the
translation. Furthermore, you should encode as much information as possible
about the error into the exception's detailed message, "root cause" exception,
resolved and remaining names. Note that resolved name and resolved object
should correspond to each other's setting.
LDAP error code
Exception or Action
success (0)
Report success.
operationsError (1)
NamingException
protocolError (2)
CommunicationException
timeLimitExceeded (3)
TimeLimitExceededException
sizeLimitExceeded (4)
SizeLimitExceededException
compareFalse (5)
Used by DirContext.search() and does not generate an
exception.
compareTrue (6)
Used by DirContext.search() and does not generate an
exception.
authMethodNotSupported (7)
AuthenticationNotSupportedException
strongAuthRequired (8)
AuthenticationNotSupportedException
partialResults (9)
If java.naming.referral is set to ignore, or contents
of error does not contain a referral, throw
PartialResultException.
Otherwise, use the contents to build a referral.
referral (10)
If java.naming.referral is set to ignore then throw
PartialResultException.
If it is set to throw then throw
ReferralException. If
it is set to follow then the provider shall follow the referral.
If the value for java.naming.ldap.referral.limit is exceeded while
following the referral then throw LimitExceededException.
adminLimitExceeded (11)
LimitExceededException
unavailableCriticalExtension (12)
OperationNotSupportedException
confidentialityRequired (13)
AuthenticationNotSupportedException
saslBindInProgress (14)
Used internally by LDAP provider during multi-stage SASL authentication.
noSuchAttribute (16)
NoSuchAttributeException
undefinedAttributeType (17)
InvalidAttributeIdentifierException
inappropriateMatching (18)
InvalidSearchFilterException
constraintViolation (19)
InvalidAttributeValueException
attributeOrValueExists (20)
AttributeInUseException
invalidAttributeSyntax (21)
InvalidAttributeValueException
noSuchObject (32)
NameNotFoundException
aliasProblem (33)
NamingException
invalidDNSyntax (34)
InvalidNameException
isLeaf (35)
Used by provider; usually doesn't generate exception.
aliasDereferencingProblem (36)
NamingException
inappropriateAuthentication (48)
AuthenticationNotSupportedException
invalidCredentials (49)
AuthenticationException
insufficientAccessRights (50)
NoPermissionException
busy (51)
ServiceUnavailableException
unavailable (52)
ServiceUnavailableException
unwillingToPerform (53)
OperationNotSupportedException
loopDetect (54)
NamingException
namingViolation (64)
InvalidNameException
objectClassViolation (65)
SchemaViolationException
notAllowedOnNonLeaf (66)
ContextNotEmptyException
notAllowedOnRDN (67)
SchemaViolationException
entryAlreadyExists (68)
NameAlreadyBoundException
objectClassModsProhibited (69)
SchemaViolationException
affectsMultipleDSAs (71)
NamingException
other (80)
NamingException
10. API Mapping
The methods of the JNDI API context interfaces are mapped onto LDAP operations
as follows.
EventContext.addNamingListener
EventDirContext.addNamingListener
Register a listener for receiving naming events that take place in the
specified subtree of LDAP entries. LDAP servers notify clients of events
by means of LDAP controls attached to LDAP operation responses or by means
of an LDAP unsolicited notifications.
Such responses are then processed by the LDAP provider and indicated to the
application in the form of NamingEvent
or UnsolicitedNotificationEvent.
Context.addToEnvironment
Update context's environment properties. If multiple contexts
share the same set of environment properties, the provider should take
care to only modify the intended context's environment. Changing an environment
property might require changes to the existing connection the context is
using.
Supplying null for the property value has the same effect as removing
the property.
For all environment properties, the new property is recorded even if
it does not affect the context. See the Environment Properties
section.
Context.bind
DirContext.bind
Perform an LDAP add operation to create a new entry in the directory.
The
DirContext.bind method can accept null as the object to bind
if it is also supplied a non-null set of attributes. Otherwise, if the
method is given insufficient information (i.e., no object or attributes),
no entry can be added. If an object is provided in the arguments, then
it is converted into attributes and stored in the entry along with any
supplied attributes, as described in the Java Objects
section. The provider should use the DirectoryManager.getStateToBind
method to transform the input object into a form that it can store.
If the provider does not support binding any objects in the directory
then it should throw OperationNotSupportedException. Otherwise,
if it does support binding objects but does not support the supplied object
then it should throw IllegalArgumentException.
Context.close
Release resources associated with context. For example, if the connection
being used by this context is not shared with another context, the provider
may abandon any outstanding requests and close the network connection to
the server. Precisely which resources are released is implementation-dependent.
Context.composeName
If the parent context is from the same LDAP namespace,
then concatenate the names according to the LDAP name syntax described in
Context.getNameParser().
Otherwise, concatenate the names as composite names.
Context.createSubcontext
DirContext.createSubcontext
Perform an LDAP add operation to create the named entry and its associated
attributes. If no attributes are supplied then the objectClass attribute
is generated with the values top and javaContainer
(javaContainer is a
structural class that is necessary to avoid a schema violation error).
Context.destroySubcontext
Perform an LDAP delete operation to remove the named entry and its
associated attributes. The named entry must be a leaf entry; subtrees are
not removed. If the leaf entry does not exist (but its parent exists),
the operation still succeeds.
LdapContext.extendedOperation
Perform an LDAP extended operation.
DirContext.getAttributes
Perform an LDAP base-object search operation to retrieve the LDAP entry's
attributes. Use "(objectclass=*)" as the filter.
If the list of requested attributes is null or contains the special
attribute identifier '*' then all the user attributes at the LDAP entry
are returned. If operational attributes are required then those
attribute identifiers must be present in the list of requested attributes.
LdapContext.getConnectControls
Retrieve the connection request controls in effect for LDAP bind operations
invoked on this context.
Context.getEnvironment
Return the environment properties recorded at the context.
Context.getNameInNamespace
Return the LDAP distinguished name of the context.
Context.getNameParser
Return a name parser that parses LDAP names according to RFC 2253.
LdapContext.getRequestControls
Retrieve the request controls in effect for LDAP operations subsequently
invoked on this context.
LdapContext.getResponseControls
Retrieve the response controls returned by the last LDAP operation invoked
on this context.
Perform an LDAP one-level search operation of the named entry using
the filter "(objectclass=*)" to retrieve the names of the entries immediately
below the named entry.
Ask for, at a minimum,
the javaClassName attributes so that the class
name of each entry can be determined. If the class name cannot
be determined, return javax.naming.directory.DirContext as
the class name.
The names which are returned are either relative to the named context
or they are LDAP or LDAPS URLs.
Context.listBindings
Perform an LDAP one-level search operation of the named entry using
the filter "(objectclass=*)" to retrieve the attributes representing objects
(or object references). Request the attributes for reconstructing
the Java object and possibly other attributes as well.
See Java Objects on how to reconstruct
the object. If the object cannot be reconstructed according to RFC 2713
then return a DirContext object representing the LDAP entry. The
provider should use the DirectoryManager.getObjectInstance method
to satisfy calls to the Binding.getObject method.
The names which are returned are either relative to the named context
or they are LDAP or LDAPS URLs.
Context.lookup
Context.lookupLink
Perform an LDAP base-object search operation of the named entry using
the filter "(objectclass=*)". Request (possibly all) the attributes for
reconstructing the Java object. See Java Objects on
how to reconstruct the object. The provider should use the DirectoryManager.getObjectInstance
method to satisfy calls to the Binding.getObject method.
DirContext.modifyAttributes
Perform an LDAP modify operation at the named entry using the supplied
modifications. For the overloaded method that accepts an Attributes,
first convert the Attributes argument into an ordered list of
modifications by enumerating its contents using Attributes.getAll()
and reusing the modification operation argument (mod_op).
LdapContext.newInstance
Initialize an new instance of this context with the specified request controls.
Context.rebind
DirContext.rebind
This method may involve several different LDAP operations. First get
the existing entry's attributes. If the existing entry does not exist,
this method behaves the same as bind(). Otherwise, if no attributes
have been supplied and the object being bound is DirContext, invoke
DirContext.getAttributes()
and use the result as the attributes argument (attrs). If there
are still no attributes, use the original entry's attributes as attrs.
Remove the existing entry using the LDAP delete operation. Convert the
object provided in the arguments into attributes (as described in the Java
Objects section) and store in the entry along with attrs using
the LDAP add operation. The provider should use the DirectoryManager.getStateToBind
method to transform the input object into a form that it can store.
LdapContext.reconnect
Reconnect to the LDAP server using the supplied connection request controls
and the current environment properties.
Context.removeFromEnvironment
Remove context's environment properties. If multiple contexts
share the same set of environment properties, the provider should take
care to only modify the intended context's environment. Changing an environment
property might require changes to the existing connection the context is
using.
For all environment properties, the new property is recorded even if it
does not affect the context. Removing a property should cause the context
to assume the property's default.
EventContext.removeNamingListener
Deregister a naming event listener so that subsequent events
destined for that listener are not delivered.
Context.rename
Perform an LDAP modify DN operation to rename the entry. If LDAPv2
is being used then the new name and the old name must share the same immediate
parent name. If the parents are not equal then throw InvalidNameException.
Perform an LDAP search operation according to the specified search
controls.
If the list of requested attributes is null or contains the special
attribute identifier '*' then all the user attributes at the LDAP entry
are returned. If operational attributes are required then those attribute
identifiers must be present in the list of requested attributes.
If objects are requested to be returned, then the Java object-related
attributes (RFC 2713)
are requested in addition to any requested by the API user. If these attributes
are present then they are used to assemble the original objects (see Java
Objects). If the object cannot be reconstructed according to RFC 2713
then return a DirContext object representing the LDAP entry. The
provider should use the DirectoryManager.getObjectInstance method
to satisfy calls to the Binding.getObject method.
The names which are returned are either relative to the named context
or they are LDAP or LDAPS URLs.
The provider may use an LDAP compare operation instead of an LDAP search
when the search filter supplied is suitably constrained:
The filter must be of the form "(<attributeID>=<value>)"
The scope must be object scope
Zero attributes must be requested (empty returning-attributes list)
In the forms of search that accept a string filter as argument,
the syntax of the filter follows
RFC 2254
with the exception that Unicode characters are also allowed. The use of
Unicode characters is preferable to the use of encoded UTF-8 octets. The
service provider is responsible for translating the Unicode characters
into their corresponding UTF-8 representation for transmission to the server.
For example, the Greek letter alpha can be specified in the string filter
either as "\u03B1" or as "\\CE\\B1".
In the form search(Name, Attributes) and related methods, the
Attributes
argument is converted into a string filter by creating a conjunctive expression
out of its elements. Each attribute value is treated as a literal; therefore
'*' and other special characters defined in RFC 2254
that appear in the values of an attribute should be escaped according to
the rules in RFC 2254.
For example, an attribute value of '*' should be encoded as the string
"\\2a".
In the form search(Name, String filterExpr, Object[] filterArgs)
and its String overloaded method, "{num}" expansion is
done in the filter by putting in values from filterArgs. Each
"{num}" component may appear in the place of "attr" or "value" in
Section 4 from
RFC 2254.
The objects in filterArgs should be encoded in the following
way:
byte arrays (byte[]) are encoded by encoding each byte as a string
according to RFC 2254.
For example, the array {0, 1, 10, 100} is encoded as the string "\\00\\01\\0a\\64".
Strings are treated as literals. In other words, '*' and other special
characters defined in RFC 2254
that appear in the string are escaped according to the rules in RFC 2254.
For example, a string of "*" is encoded as the string "\\2a".
Objects that are neither String nor byte[] are converted
to their string form using Object.toString() and then the rules
for
String applied.
LdapContext.setRequestControls
Set the request controls for LDAP operations subsequently invoked on this
context.
EventContext.targetMustExist
Determine whether a listener can register interest in an LDAP entry that
doesn't exist.
Context.unbind
Perform an LDAP delete operation to remove the named entry. The named
entry must be a leaf entry; subtrees are not removed. If the leaf entry
does not exist (but its parents exist), the operation still succeeds.
11. Federation
The LDAP service provider should support federation using strong separation
and either or both of junctions or implicit next naming system pointer.
12. SASL
The provider supports SASL mechanisms by means of the
Java SASL API
(JSR 28).
This allows SASL mechanism drivers from different vendors to be used
with the LDAP provider, and also allows a SASL mechanism driver to be used
with different LDAP providers and even non-LDAP protocol libraries.
The Java SASL API depends on the
Java
Authentication and Authorization Service (JAAS), which provides callback
support for SASL mechanisms that need to obtain or supply user/application
information directly.
12.1 SASL Configuration
To specify that SASL authentication be used,
you specify the official IANA-registered names of the SASL mechanisms
in the
java.naming.security.authentication
property.
The first SASL mechanism on the list that is both available and satisfies
the optionally specified policies is used.
That is, properties with the prefix "javax.security.sasl.policy."
can be used
to control the security characteristics of the selected SASL mechanism.
Some SASL mechanisms require the identity of the entity being authenticated.
This is known as the authentication ID.
Some SASL mechanisms, like DIGEST-MD5, require the use
of a password and/or a realm.
By default, the provider supplies the value of
java.naming.security.principal property as
the authentication ID to any SASL mechanism that requires the authentication ID,
the value of the
java.naming.security.credentials
property as the password, and the value of the
java.naming.security.sasl.realm
property as the realm.
To override these defaults, use the
java.naming.security.sasl.callback
property.
SASL mechanisms support the notion of authorization identity or authorization
ID, which is the entity to which the server should grant access if the
authentication succeeds.
If the
java.naming.security.sasl.authorizationId
property has been set, then its value is used as the authorization ID.
Otherwise, the empty string is used as the authorization ID, which
directs the server to derive an authorization ID from the
client's authentication credentials.
See SASL properties for a description of the
properties used by an LDAP service provider for supporting SASL.
In addition to these properties, there might be properties required
for specific SASL mechanisms.
For example, a SASL mechanism that supports privacy and integrity
needs to know the quality of protection that the client requires.
Properties such as these are passed to
the SASL mechanism via the environment properties.
See the
JNDI documentation for how to set environment properties.
For example, if the application needs privacy,
it can do so by using a call such as:
env.put("javax.security.sasl.qop", "auth-conf");
before passing env to the initial context constructor.
See the Java SASL API for details about these properties.
12.2 SASL Mechanism Drivers
The Java SASL API
provides a framework for dynamically plugging in SASL mechanism
drivers. The LDAP provider might provide a few default drivers.
See the Java SASL API for details.
13. Extensions and Controls
The provider supports LDAP extensions and controls using the javax.naming.ldap
package. In addition, the provider supports LDAP unsolicited notifications
(which are transmitted in LDAP extended operation responses) using the
services of the javax.naming.event package.
Several LDAP extensions and controls are defined by the IETF LDAPEXT
working group.
The "Start
TLS" extension ("1.3.6.1.4.1.1466.20037") is supported by the
StartTlsRequest
and
StartTlsResponse
classes.
The LDAP provider must provide a concrete implementation of the
abstract StartTlsResponse class and make its implementation
available to the LDAP provider. See the description in
StartTlsRequest.createExtendedResponse.
Typically, the StartTlsResponse implementation would need access
to the LDAP provider's data structures.
The LDAP service provider should perform hostname verification after Start TLS
negotiation as specified in RFC 2830. If the LDAP
server was discovered automatically by using information in DNS
(as described in the URLs section),
the provider should use the domain name derived from the distinguished
name as the hostname to verify, as recommended by
draft-ietf-ldapext-locate-08.txt.
14. Event Notification
The provider supports event notification using the javax.naming.event
package.
A JNDI application can register for events that occur in the directory,
such as the addition or removal of an entry, or the modification of an
entry. Applications can also register for unsolicited notifications.
and by selecting the hostname and port number of an LDAP server that supports
SSL. Once an SSL connection has been established subsequent LDAP protocol
exchanges take place over that secure connection.