2016-01-12 1 views
1

Je dois vérifier si le nom d'utilisateur et mot de passe donné par l'utilisateur correspondent bien au serveur LDAP. J'utilise deux connexions, dans le premier je récupère dn de l'uid et dans la seconde je me connecte à Ldap avec dn et mot de passe. J'ai un problème avec dn récupéré, il n'a pas les bons champs. Il retourneVérifiez le nom d'utilisateur et mot de passe dans le serveur Ldap par le biais de Java

cn=Lu Ca+sn=Ca+uid=luca+userPassword={SSHA}OiMBVTTZBPqnohYch9\+ISeVv\+5ucgxMR: null:null:No attributes 

et non

cn=Lu Ca+sn=Ca+uid=luca+userPassword={SSHA}OiMBVTTZBPqnohYch9\+ISeVv\+5ucgxMR,ou=people,dc=example,dc=com 

Comme vous pouvez le voir, et dc ous ne sont pas renvoyés donc ma deuxième requête échoue. Ceci est mon code

@Override 
public void isAuthenticated(String username, String password) throws LdapException{ 
    String dn; 
    Hashtable<String, Object> ldapEnv = new Hashtable<String, Object>(); 
    ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
    ldapEnv.put(Context.PROVIDER_URL, env.getRequiredProperty(PROPERTY_NAME_LDAP_URL)); 
    ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    ldapEnv.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system"); 
    ldapEnv.put(Context.SECURITY_CREDENTIALS, "secret"); 
    String[] returnAttribute = {"dn"}; 
    DirContext ctx = null; 
    NamingEnumeration<SearchResult> results = null; 
    try { 
     ctx = new InitialDirContext(ldapEnv); 
     SearchControls controls = new SearchControls(); 
     controls.setReturningAttributes(returnAttribute); 
     controls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
     String filter = "uid=" + username ; 
     results = ctx.search(env.getRequiredProperty(PROPERTY_NAME_LDAP_USERSEARCHBASE), filter, controls); 
     if (results.hasMore()) 
      dn = results.nextElement().toString(); 
     else throw new LdapException("Wrong username. Please retry!"); 
    } catch (Exception e) { 
     throw new LdapException(e); 
    } finally { 
     try{ 
      if (results != null) 
       results.close();    
      if (ctx != null) 
       ctx.close(); 
     }catch(Exception e){ 
      throw new LdapException(e); 
     } 
    } 
    Hashtable<String, Object> authEnv = new Hashtable<String, Object>(); 
    authEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); 
    authEnv.put(Context.PROVIDER_URL, env.getRequiredProperty(PROPERTY_NAME_LDAP_URL)); 
    authEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    authEnv.put(Context.SECURITY_PRINCIPAL, dn); 
    authEnv.put(Context.SECURITY_CREDENTIALS, password); 
    try { 
     new InitialDirContext(authEnv); 
    } catch (AuthenticationException authEx) { 
     throw new LdapException("Authentication error. Password was wrong"); 
    } catch(Exception e){ 
     throw new LdapException(e); 
    } 
} 

avec ces paramètres

ldap.url=ldap://127.0.0.1:10389/dc=example,dc=com 
ldap.userSearchBase=ou=people 

J'uing également cette valeur pour l'authentification du printemps mais j'ai une méthode (envoyer gros fichier) qui ne parvient que si j'utilise l'authentification si Je voudrais essayer de m'authentifier avec Java et non pas à travers le printemps Savez-vous pourquoi j'ai ce problème? grâce

MISE À JOUR: avec

dn = results.nextElement().getNameInNamespace(); 

cela fonctionne, est mes codes robustes?

Répondre

0

Ceci est la mise en œuvre du module de connexion LDAP jboss vous pouvez vous comparer le code:

full code link

protected void rolesSearch(LdapContext ctx, SearchControls constraints, String user, String userDN, 
     int recursionMax, int nesting) throws NamingException 
    { 
     LdapContext ldapCtx = ctx; 

     Object[] filterArgs = {user, sanitizeDN(userDN)}; 
     boolean referralsExist = true; 
     while (referralsExist) { 
     NamingEnumeration results = ldapCtx.search(rolesCtxDN, roleFilter, filterArgs, constraints); 
     try 
     { 
      while (results.hasMore()) 
      { 
       SearchResult sr = (SearchResult) results.next(); 

       String dn; 
       if (sr.isRelative()) { 
        dn = canonicalize(sr.getName()); 
       } 
       else { 
        dn = sr.getNameInNamespace(); 
       } 
       if (nesting == 0 && roleAttributeIsDN && roleNameAttributeID != null) 
       { 
        if(parseRoleNameFromDN) 
        { 
        parseRole(dn); 
        } 
        else 
        { 
        // Check the top context for role names 
        String[] attrNames = {roleNameAttributeID}; 
        Attributes result2 = null; 
        if (sr.isRelative()) { 
         result2 = ldapCtx.getAttributes(quoteDN(dn), attrNames); 
        } 
        else { 
         result2 = getAttributesFromReferralEntity(sr, user, userDN); 
        } 
        Attribute roles2 = (result2 != null ? result2.get(roleNameAttributeID) : null); 
        if(roles2 != null) 
        { 
         for(int m = 0; m < roles2.size(); m ++) 
         { 
          String roleName = (String) roles2.get(m); 
          addRole(roleName); 
         } 
        } 
        } 
       } 

       // Query the context for the roleDN values 
       String[] attrNames = {roleAttributeID}; 
       Attributes result = null; 
       if (sr.isRelative()) { 
        result = ldapCtx.getAttributes(quoteDN(dn), attrNames); 
       } 
       else { 
        result = getAttributesFromReferralEntity(sr, user, userDN); 
       } 
       if (result != null && result.size() > 0) 
       { 
        Attribute roles = result.get(roleAttributeID); 
        for (int n = 0; n < roles.size(); n++) 
        { 
        String roleName = (String) roles.get(n); 
        if(roleAttributeIsDN && parseRoleNameFromDN) 
        { 
         parseRole(roleName); 
        } 
        else if (roleAttributeIsDN) 
        { 
         // Query the roleDN location for the value of roleNameAttributeID 
         String roleDN = quoteDN(roleName); 
         String[] returnAttribute = {roleNameAttributeID}; 
         try 
         { 
          Attributes result2 = null; 
          if (sr.isRelative()) { 
           result2 = ldapCtx.getAttributes(roleDN, returnAttribute); 
          } 
          else { 
           result2 = getAttributesFromReferralEntity(sr, user, userDN); 
          } 

          Attribute roles2 = (result2 != null ? result2.get(roleNameAttributeID) : null); 
          if (roles2 != null) 
          { 
           for (int m = 0; m < roles2.size(); m++) 
           { 
           roleName = (String) roles2.get(m); 
           addRole(roleName); 
           } 
          } 
         } 
         catch (NamingException e) 
         { 
          PicketBoxLogger.LOGGER.debugFailureToQueryLDAPAttribute(roleNameAttributeID, roleDN, e); 
         } 
        } 
        else 
        { 
         // The role attribute value is the role name 
         addRole(roleName); 
        } 
        } 
       } 

       if (nesting < recursionMax) 
       { 
        rolesSearch(ldapCtx, constraints, user, dn, recursionMax, nesting + 1); 
       } 
      } 
      referralsExist = false; 
     } 
     catch (ReferralException e) { 
      ldapCtx = (LdapContext) e.getReferralContext(); 
     } 
     finally 
     { 
      if (results != null) 
       results.close(); 
     } 
     } // while (referralsExist) 
    }