We recently released Spring LDAP 1.3.0.RC1. This long awaited release contains a number of new features and bug fixes. In this post I’ll highlight some of the changes, pointing out some of my favorite Spring LDAP features.
Simple Authentication Mechanism
By far the most requested feature for inclusion in Spring LDAP has been the ability to easily perform simple authentication using the library. While you would typically like to use Spring Security to implement full-blown application security many of our users have expressed the need to just do the authentication part, not having to worry about the full Spring Security framework. This is now explicitly supported with a new method in the ContextSource
interface: getContext(String principal, String password)
. This means that in order to do simple user authentication you would write something like the following:
...
private SimpleLdapTemplate ldapTemplate;
private ContextSource contextSource;
public void setLdapTemplate(SimpleLdapTemplate ldapTemplate) {
this.ldapTemplate = ldapTemplate;
}
public void setContextSource(ContextSource contextSource) {
this.contextSource = contextSource;
}
public boolean authenticate(String userName, String password) {
EqualsFilter filter = new EqualsFilter("uid", userName);
// Actual filter will differ depending on LDAP Server and schema
List results = ldapTemplate.search("", filter.toString(),
new DnContextMapper());
if (results.size() != 1) {
throw new IncorrectResultSizeDataAccessException(1, results.size());
}
DirContext ctx = null;
try {
ctx = contextSource.getContext(results.get(0), password);
return true;
} catch (Exception e) {
return false;
} finally {
LdapUtils.closeContext(ctx);
}
}
private final static class DnContextMapper extends
AbstractParameterizedContextMapper {
@Override
protected String doMapFromContext(DirContextOperations ctx) {
return ctx.getNameInNamespace();
}
}
The required XML configuration for this:
LDAP Data Management
Working with data in LDAP is usually tedious and verbose. Spring LDAP relieves the programmer from explicitly worrying about the details of the underlying Attributes and encapsulates all data regarding an LDAP entry in the DirContextAdapter
class. You can get the Attributes of an entry using a DirContextAdapter
in a ContextMapper
(or ParameterizedContextMapper
like above), or you can use the Attribute management capabilities in DirContextAdapter
to help you when performing updates or creating entries.
This has been one of the key features from Spring LDAP from the very beginning, and the API has been improved further in this release; particularly a new bind
has been added in Spring LDAP, enabling even simpler standard repository code using Spring LDAP:
public void create(Person p) {
p.setDn(buildDn(p));
DirContextOperations ctx = new DirContextAdapter(p.getDn());
setAttributeValues(p, ctx);
ldapTemplate.bind(ctx);
}
public void update(Person p) {
DirContextOperations ctx = ldapTemplate.lookupContext(p.getDn());
setAttributeValues(p, ctx);
ldapTemplate.modifyAttributes(ctx);
}
private void setAttributeValues(Person p, DirContextOperations ctx) {
ctx.setAttributeValue("description", p.getDescription());
ctx.setAttributeValue("telephoneNumber", p.getPhone());
// Set more attribute values here.
}
DirContextAdapter
now also supports entries that represent referrals. This means that if you configure your ContextSource
to follow referrals (setting the referral
property to follow
and properly configuring DNS settings so that the server names of the referrals can be resolved) you can get the server URL from any DirContextAdapter
resulting from referrals.
TLS Connections
It is a very common setup that the LDAP server is configured only to accept TLS connections. This has previously not been supported by Spring LDAP, but due to some internal rework in AbstractContextSource
it is now possible to perform some more elaborate authentication and connection negotiation logic by supplying a DirContextAuthenticationStrategy
implementation to the ContextSource
. To enable TLS connections you will supply a DefaultTlsDirContextAuthenticationStrategy
to your LdapContextSource
:
Authentication customization has previously often been done by subclassing LdapContextSource
. The recommended approach from Spring LDAP 1.3 is to create a custom DirContextAuthenticationStrategy
implementation to suit your need. This would be useful for e.g. LDAP Proxy Authentication or similar functionality.
Major Bug Fixes and Other Changes
Some interesting bug fixes are included in Spring LDAP. Also, some default behavior has been changed; the most important stuff is listed here:
Distinguished Name toString representation
It has long been requested that the Spring LDAP DistinguishedName
toString
representation should be changed. The toString
representation has previously been focused on the readability of the string, adding spaces between the RDNs to make it less compact, e.g.:
cn=John Doe, ou=Some Company, c=Sweden
Several users have been complaining that their DN representations have been compact and that the discrepancy has been causing problems:
cn=John Doe,ou=Some Company,c=Sweden
We have changed the default string representation to the compact one in the 1.3 release. If your system should require the old, ‘spaced’ format, you can change the default by setting the system property org.springframework.ldap.core.spacedDnFormat
to true
.
Built-in JNDI Connection Pooling
The pooled
property of ContextSource
has previously defaulted to true
, enabling the built-in Java LDAP connection pooling by default. However the built-in LDAP connection pooling suffers from several deficiencies (most notable there is no way of doing connection validation and configuration is cumbersome), which is why we decided to change the default to false
. If you require connection pooling we strongly recommend using the Spring LDAP PoolingContextSource
instead.
The Dreaded ” in Distinguished Names Problem
Java JNDI cannot handle ” in the Distinguished Names of entries in an LDAP tree. If they do, the DN returned from JNDI will be invalid, which previously caused Spring LDAP to throw an exception. We now work around this bug.
Downloads
We obviously want people to use our stuff. Here are the relevant links:
Binaries(sha)
Binary With Dependencies(sha)
Javadocs
Reference docs
Maven Users
Since this is a release candidate it is not published to the main maven repository. It is however available from the Spring Framework milestone repository:
spring-milestone
Spring Portfolio Milestone Repository
http://s3.amazonaws.com/maven.springframework.org/milestone
The maven dependencies are as follows:
org.springframework.ldap
spring-ldap-core
1.3.0.RC1
org.springframework.ldap
spring-ldap-core-tiger
1.3.0.RC1
Summary
In addition to the above there’s quite a number of minor feature enhancements and bug fixes. The full change log can be found here. We’re obviously very interested in getting your feedback. Please post any comments you might have on the Sping LDAP Support Forum. Bugs should be submitted to the Spring Framework Jira System.
Pingback: itemprop="name">Selección Digital» springframework.org » Spring LDAP 1.3.0.RC1 Released
Thanks for the summary. Looking forward to upgrading, especially for the improved pooling and “” fixes!
You Ldap Config might be incorrect.
You are missing the class def.
Thx
Quite right, thanks for noticing. I’ll fix that right away.
How can I get the password policy message by using the spring-ldap 1.3?
Hi,
for Spring-Ldap version 2 the TLS configuration is the same?