From a468f03cae6c6c406d3dfe891ccdcfa829526088 Mon Sep 17 00:00:00 2001 From: Luke Taylor Date: Mon, 1 May 2006 00:28:27 +0000 Subject: [PATCH] Add functionality to LdapTemplate for checking that an entry exists, and for retrieving an entry as an object, mapped from its attributes. --- .../acegisecurity/ldap/AttributesMapper.java | 31 ++++++++++++ .../org/acegisecurity/ldap/LdapTemplate.java | 48 +++++++++++++++++-- 2 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 core/src/main/java/org/acegisecurity/ldap/AttributesMapper.java diff --git a/core/src/main/java/org/acegisecurity/ldap/AttributesMapper.java b/core/src/main/java/org/acegisecurity/ldap/AttributesMapper.java new file mode 100644 index 0000000000..83bd2097cd --- /dev/null +++ b/core/src/main/java/org/acegisecurity/ldap/AttributesMapper.java @@ -0,0 +1,31 @@ +/* Copyright 2004, 2005 Acegi Technology Pty Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.acegisecurity.ldap; + +import javax.naming.directory.Attributes; +import javax.naming.NamingException; + +/** + * A mapper for use with {@link LdapTemplate}. Creates a customized object from + * a set of attributes retrieved from a directory entry. + * + * @author Luke Taylor + * @version $Id$ + */ +public interface AttributesMapper { + + public Object mapAttributes(Attributes attributes) throws NamingException; +} diff --git a/core/src/main/java/org/acegisecurity/ldap/LdapTemplate.java b/core/src/main/java/org/acegisecurity/ldap/LdapTemplate.java index 5d896a3981..1cd936452b 100644 --- a/core/src/main/java/org/acegisecurity/ldap/LdapTemplate.java +++ b/core/src/main/java/org/acegisecurity/ldap/LdapTemplate.java @@ -17,6 +17,7 @@ package org.acegisecurity.ldap; import javax.naming.NamingException; import javax.naming.NamingEnumeration; +import javax.naming.NameNotFoundException; import javax.naming.directory.DirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; @@ -44,7 +45,7 @@ public class LdapTemplate { public static final String[] NO_ATTRS = new String[0]; private InitialDirContextFactory dirContextFactory; - private String userDn = null; + private String managerDn = null; private String password = null; /** Default search scope */ private int searchScope = SearchControls.SUBTREE_SCOPE; @@ -57,10 +58,10 @@ public class LdapTemplate { public LdapTemplate(InitialDirContextFactory dirContextFactory, String userDn, String password) { this(dirContextFactory); - Assert.hasLength(userDn, "userDn must not be null or empty"); + Assert.hasLength(userDn, "managerDn must not be null or empty"); Assert.notNull(password, "password cannot be null"); - this.userDn = userDn; + this.managerDn = userDn; this.password = password; } @@ -72,9 +73,9 @@ public class LdapTemplate { DirContext ctx = null; try { - ctx = (userDn == null) ? + ctx = (managerDn == null) ? dirContextFactory.newInitialDirContext() : - dirContextFactory.newInitialDirContext(userDn, password); + dirContextFactory.newInitialDirContext(managerDn, password); return callback.execute(ctx); @@ -162,4 +163,41 @@ public class LdapTemplate { return (Set)execute(new SingleAttributeSearchCallback()); } + + public boolean nameExists(final String dn) { + + Boolean exists = (Boolean) execute( new LdapCallback() { + + public Object execute(DirContext ctx) throws NamingException { + try { + ctx.lookup( LdapUtils.getRelativeName(dn, ctx) ); + } catch(NameNotFoundException nnfe) { + return Boolean.FALSE; + } + + return Boolean.TRUE; + } + } + ); + + return exists.booleanValue(); + } + + /** + * Composes an object from the attributes of the given DN. + * + * @param dn the directory entry which will be read + * @param mapper maps the attributes to the required object + * @param attributesToRetrieve the named attributes which will be retrieved from the directory entry. + * @return the object created by the mapper + */ + public Object retrieveEntry(final String dn, final AttributesMapper mapper, final String[] attributesToRetrieve) { + return execute ( new LdapCallback() { + + public Object execute(DirContext ctx) throws NamingException { + return mapper.mapAttributes( ctx.getAttributes(LdapUtils.getRelativeName(dn, ctx), attributesToRetrieve) ); + + } + } ); + } }