Question

Je tente d'obtenir une application Java à l'aide-sécurité printemps pour parler à une instance ADAM locale que j'ai installé.

J'ai installé avec succès ADAM et la configuration comme suit ....

  • instance en cours d'exécution sur localhost: 389
  • Racine est O=Company
    • Un enfant appelé OU=Company Users (orgnizationalUnit)
      • A granchild appelé CN=Mike Q (utilisateur)
      • uid = mike et password = welcome

Alors je ressort de sécurité de configuration (version 3.0.3,-cadre ressort 3.0.4 et ressort ldap 1.3.0). fichier printemps

  <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"/>

Et TestAuthentication

public class TestAuthentication
{
    @Autowired
    private AuthenticationManager authenticationManager;

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

L'exécution de ce que j'obtiens l'erreur suivante

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 quelqu'un pouvait indiquer où je vais mal, je serais reconnaissant. À ce stade, je veux juste authentifier un utilisateur entré / mot de passe en utilisant LDAP, rien de plus complexe que cela.

Je suis également intéressé par quelques points généraux que ceci est ma première incursion dans le monde LDAP.

  • est le cas LDAP sensible?
  • des espaces mieux éviter?
  • Quels sont les cas d'utilisation générales / meilleures pratiques pour éviter d'envoyer le mot de passe en texte clair dans la requête LDAP?
Était-ce utile?

La solution

OK afin que je passe beaucoup de temps à résoudre ce voici la réponse.

Code d'erreur 2030 signifie que le DN de l'utilisateur est valide.

Après quelques essais et erreurs est ici une config qui fonctionne et ne recherche utilisateur correctement. (Vous pouvez probablement réécrire cela en utilisant l'espace de noms de sécurité, mais alors que je travaillais sur ce qu'il était plus clair d'utiliser les définitions de haricots crus).

  <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>

Les éléments clés sont

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

Lors de la spécification du userdn dans la source de contexte, il doit être le DN complet (il ne se contente pas append le faire la base fournie dans l'URL (constructeur arg).

Lors de l'utilisation BindAuthentication

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

Cette valeur est un suffixe au-dessus de la basedn de la source de contexte.

Lors de la configuration d'un userSearch

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

Je ne pouvais pas obtenir de travailler avec cn=People étant dans la deuxième arg, mais cela semble fonctionner très bien. Notez que vous pouvez utiliser des attributs de l'utilisateur par exemple (uid={0})

Et voici quelques exemples de code en utilisant les définitions de haricots ...

    @Autowired
    private LdapUserSearch ldapUserSearch;

    @Autowired
    private AuthenticationProvider authenticationProvider;

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

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

D'autres gourmandises au hasard ...

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)

Je espère que tout cela aide quelqu'un d'autre.

Autres conseils

Je fixe ce problème en ajoutant l'utilisateur que vous essayez d'utiliser en tant que membre du rôle des administrateurs dans la même base DN. Hope qui aide

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top