2010-09-24 21 views
5

Estoy tratando de obtener una aplicación de Java usando spring-security para hablar con una instancia local de ADAM que he configurado.Autenticación usando LDAP contra ADAM usando seguridad de primavera

He instalado con éxito ADAM y la configuración de la siguiente manera ....

  • Instancia se ejecuta en localhost: 389
  • raíz es O=Company
    • Un niño llamado OU=Company Users (orgnizationalUnit)
      • Un granchild llamado CN=Mike Q (usuario)
      • uid = mike y password = welcome

entonces he instalación resorte de seguridad (versión 3.0.3, 3.0.4 primavera-marco y la primavera-LDAP 1.3.0). archivo

<security:ldap-server id="contextSource" url="ldap://localhost:389/o=Company"/> 

    <security:authentication-manager> 
    <security:ldap-authentication-provider user-dn-pattern="uid={0},ou=Company Users"/> 
    </security:authentication-manager> 

    <bean class="com.xxx.test.TestAuthentication" lazy-init="false"/> 

Primavera Y TestAuthentication

public class TestAuthentication 
{ 
    @Autowired 
    private AuthenticationManager authenticationManager; 

    public void initialise() 
    { 
     Authentication authentication = new UsernamePasswordAuthenticationToken("mike", "welcome"); 
     Authentication reponseAuthentication = authenticationManager.authenticate(authentication); 
    } 
} 

La ejecución de este me sale el siguiente error

Caused by: javax.naming.AuthenticationException: [LDAP: error code 49 - 8009030C: LdapErr: DSID-0C090336, comment: AcceptSecurityContext error, data 2030, vece] 
at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3041) 
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2987) 
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2789) 
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2703) 
at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:293) 
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175) 
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193) 
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136) 
at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66) 
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667) 
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) 
at javax.naming.InitialContext.init(InitialContext.java:223) 
at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:134) 
at org.springframework.ldap.core.support.LdapContextSource.getDirContextInstance(LdapContextSource.java:43) 
at org.springframework.ldap.core.support.AbstractContextSource.createContext(AbstractContextSource.java:254) 

Si alguien podría señalar dónde voy mal te agradecería. En este punto, solo quiero autenticar un usuario/contraseña ingresado usando LDAP, nada más complejo que eso.

También estoy interesado en algunos puntos generales ya que esta es mi primera incursión en el mundo de LDAP.

  • ¿Es sensible a las mayúsculas/minúsculas LDAP?
  • ¿Se evitan mejor los espacios?
  • ¿Cuáles son los casos de uso generales/mejores prácticas para evitar enviar la contraseña en texto sin cifrar en la consulta LDAP?

Respuesta

4

OK, así que como pasé mucho tiempo resolviendo esto aquí está la respuesta.

El código de error 2030 significa que el DN del usuario no es válido.

Después de un poco de prueba y error aquí hay una configuración que funciona y la búsqueda del usuario funciona correctamente. (Probablemente pueda volver a escribir esto usando el espacio de nombres de seguridad, pero mientras estaba trabajando en esto, era más claro usar las definiciones de beans crudos).

<bean id="contextSource" 
     class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 
    <constructor-arg value="ldap://localhost:389/cn=Sandbox,dc=ITOrg"/> 
    <property name="userDn" value="cn=superuser,cn=People,cn=Sandbox,dc=ITOrg"/> 
    <property name="password" value="xxxxxx"/> 
    </bean> 

    <bean id="ldapAuthProvider" 
     class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider"> 
    <constructor-arg> 
     <bean class="org.springframework.security.ldap.authentication.BindAuthenticator"> 
     <constructor-arg ref="contextSource"/> 
     <property name="userDnPatterns"> 
      <list> 
      <value>cn={0},cn=People</value> 
      </list> 
     </property> 
     </bean> 
    </constructor-arg> 
    </bean> 

    <bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch"> 
    <constructor-arg index="0" value="cn=People"/> 
    <constructor-arg index="1" value="(cn={0})"/> 
    <constructor-arg index="2" ref="contextSource"/> 
    </bean> 

Los puntos clave son

<property name="userDn" value="cn=superuser,cn=People,cn=Sandbox,dc=ITOrg"/> 

Al especificar el DN de usuario en la fuente de contexto debe ser el DN completo (no se limita a añadir que haga la base suministrada en la URL (constructor de arg)

Al utilizar BindAuthentication

<value>cn={0},cn=People</value> 

Este valor es un sufijo en la parte superior de la basedn de la fuente de contexto.

Al configurar un UserSearch

<constructor-arg index="0" value="cn=People"/> 
    <constructor-arg index="1" value="(cn={0})"/> 

no pude conseguir que funcione con cn=People estar en la segunda arg pero esto parece que funciona bien. Tenga en cuenta que puede usar los atributos del usuario, p. (uid={0})

Y aquí es un código de ejemplo utilizando las definiciones de frijol ...

@Autowired 
    private LdapUserSearch ldapUserSearch; 

    @Autowired 
    private AuthenticationProvider authenticationProvider; 

    public void initialise() 
    { 
     DirContextOperations dirContextOperations = ldapUserSearch.searchForUser("username"); 

     Authentication authentication = authenticationProvider.authenticate(new UsernamePasswordAuthenticationToken("username", "password"));  
    } 

Algunas otras golosinas al azar ...

Error 52b - Invalid password 


[LDAP: error code 32 - 0000208D: NameErr: DSID-031521D2, problem 2001 (NO_OBJECT), data 0, best match of: 'CN=Sandbox,DC=ITOrg' 
    - This means the user is not in the administrator role (probably) 

Esperanza todo esto ayuda a otra persona.

0

Resolví este problema agregando el usuario que está intentando utilizar como miembro de la función de administradores en el mismo DN base. Espero que ayude

Cuestiones relacionadas