LDAP itself is already providing a pretty high level abstraction for directory servers, I haven't seen many libraries that provide a further abstraction on top of that. I have written my own little library to enable my own application to talk to LDAP servers (in my case, also an Active Directory server).
The java.naming.directory package is where the interesting stuff is. Connecting to an LDAP server is really not too hard...
// set properties for our connection and provider
Properties properties = new Properties();
properties.put( Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory" );
properties.put( Context.PROVIDER_URL, "ldap://myserver.somewhere.com:389"; );
properties.put( Context.REFERRAL, "ignore" );
// set properties for authentication
properties.put( Context.SECURITY_PRINCIPAL, "User Name" );
properties.put( Context.SECURITY_CREDENTIALS, "password" );
InitialDirContext context = new InitialDirContext( properties );
Running searches against the directory isn't that much more difficult.
// Create the search controls
SearchControls searchCtls = new SearchControls();
// Specify the search scope
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
// specify the LDAP search filter, just users
String searchFilter = "(&(objectClass=user)( cn=Joe Someone))";
// Specify the attributes to return
String returnedAtts[]={"memberOf"};
searchCtls.setReturningAttributes(returnedAtts);
NamingEnumeration answer = context.search( "dc=com,dc=somewhere", searchFilter,
searchCtls );
From there, authentication is very easy: the last line above will throw a NamingException is the username and password are not valid credentials.
I have used the Acegi Security library to good effect with a couple applications, getting Acegi to work with an LDAP backend is pretty straightforward; this may be the more high level solution you are looking for.