Spring 3.1
Tomcat 6.*
I'm working on making a Spring 3.1 webapp, authenticating with LDAP. When I hit submit on my login page, it just hangs and after a very, very long time returns with this error message:
Reason: ldap-itc.sam.acme.com:636/o=acme.com
socket closed;
nested exception is javax.naming.ServiceUnavailableException:
ldap-itc.sam.acme.com:636/o=acme.com; socket closed
I was able to connect to my organizations LDAP server by using Softerra's LDAP browser using a real user's password and plugging in the "principal" ( with the username swapped out for "uid={0}" ), which I use in my *-security.xml file:
uid={0},ou=People,o=acme.com
I was also able to connect with a JNDI styled Java program I wrote (quoted below ). That program dumped all of the users attributes, including the password, which seems to be encrypted on the LDAP server. Do I need to tell Spring 3.1 this or encrypt the password that is collected on the login screen?
I noticed that Java program I wrote/copied/adapted specified "ssl" in the context. When I commented that out, the client program also hanged for a long time and returned with the same error message as Spring 3.1. I uncommented that out, changed "ldap://" to "ldaps://" in the client program and that worked fine.
I tried the same thing in my *-security.xml. I changed "ldap://" to "ldaps://" in the ldap url. This time the webapp did not hang, but returned very quickly with a message of
"Bad Credentials"
I tested my username and password out. They are legitimate.
I also tried typing in the encrypted version of my password, but that didn't make a difference.
I'm guessing something with SSL and/or password encryption is now my problem.
Any ideas of things I could check out?
My *-security.xml and the java LDAP demo I wrote are quoted below
Thanks.
My *-security.xml file:
Here is the JNDI style LDAP Java program that WORKS with the same credentials:Code:<beans xmlns="http://www.springframework.org/schema/beans" xmlns:s="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> <s:http auto-config="true"> <s:intercept-url pattern="/welcome*" access="ROLE_USER" /> <s:form-login login-page="/login" default-target-url="/welcome" authentication-failure-url="/loginfailed" /> <s:logout logout-success-url="/logout" /> </s:http> <s:ldap-server url = "ldap://ldap-itc.sam.acme.com:636/o=acme.com"/> <s:authentication-manager> <s:ldap-authentication-provider user-dn-pattern="uid={0},ou=People,o=noaa.gov" > <s:password-compare hash="md5"> <s:password-encoder hash="md5"/> </s:password-compare> </s:ldap-authentication-provider> </s:authentication-manager> </beans>
Code:mport javax.naming.*; import javax.naming.directory.*; import java.util.*; import java.sql.*; public class LDAPDEMO { public static void main(String args[]) { String lcf = "com.sun.jndi.ldap.LdapCtxFactory"; String ldapurl = "ldap://ldap-itc.sam.acme.com:636/o=acme.com"; String loginid = "John.A.Smith"; String password = "passowordforjohn"; DirContext ctx = null; Hashtable env = new Hashtable(); Attributes attr = null; Attributes resultsAttrs = null; SearchResult result = null; NamingEnumeration results = null; int iResults = 0; env.put(Context.INITIAL_CONTEXT_FACTORY, lcf); env.put(Context.PROVIDER_URL, ldapurl); env.put(Context.SECURITY_PROTOCOL, "ssl"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "uid=" + loginid + ",ou=People,o=acme.com"); env.put(Context.SECURITY_CREDENTIALS, password); try { ctx = new InitialDirContext(env); attr = new BasicAttributes(true); attr.put(new BasicAttribute("uid",loginid)); results = ctx.search("ou=People",attr); while (results.hasMore()) { result = (SearchResult)results.next(); resultsAttrs = result.getAttributes(); for (NamingEnumeration enumAttributes = resultsAttrs.getAll(); enumAttributes.hasMore();) { Attribute a = (Attribute)enumAttributes.next(); System.out.println("attribute: " + a.getID() + " : " + a.get().toString()); }// end for loop iResults++; }// end while loop System.out.println("iResults == " + iResults); }// end try catch (Exception e) { e.printStackTrace(); } }// end function main() }// end class LDAPDEMO


Reply With Quote