аутентификация сервера каталогов apacheскажите мне, где я ошибсякод, который я использовал, приведен ниже

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

public class AdvancedBindDemo2 {

    public static void main(String[] args) throws NamingException {

        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://localhost:10389");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");

        String uid = "user1";//supplying userid manually
        String password = "secret";

        DirContext ctx = null;
        try {            
            // Step 1: Bind anonymously            
            ctx = new InitialDirContext(env);

            // Step 2: Search the directory
            String base = "ou=users,ou=system";//base
            String filter = "(objectClass=*)";           
            SearchControls ctls = new SearchControls();
            ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            ctls.setReturningAttributes(new String[0]);
            ctls.setReturningObjFlag(true);
            NamingEnumeration enm = ctx.search(base, filter, new String[] { uid }, ctls);

            String dn = null;
            if (enm.hasMore()) {
                SearchResult result = (SearchResult) enm.next();
                dn = result.getNameInNamespace();

                System.out.println("dn: "+dn);
            }

            if (dn == null || enm.hasMore()) {
                // uid not found or not unique
                throw new NamingException("Authentication failed");
            }

            // Step 3: Bind with found DN and given password
            ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, dn);
            ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
            // Perform a lookup in order to force a bind operation with JNDI
            ctx.lookup(dn);
            System.out.println("Authentication successful");

        } catch (NamingException e) {
            System.out.println(e.getMessage());
        } finally {
            ctx.close();
        }
    }
}

Вышеупомянутая программа будет аутентифицировать пользователя, а также покажет DN для пользователя. И здесь я использую Apache ds в eclipse. Из приведенной выше программы я пытаюсь получить DN: для user1, база которого ou=users,ou=system, но я не получаю DN: для user1.


person dip89    schedule 06.03.2012    source источник


Ответы (1)


Предполагая, что DN user1 — «uid=user1,ou=users,ou=system», тогда ваш фильтр следует изменить на «(uid=user1)». Также обратите внимание, что атрибут, который вы запрашиваете, неверен, он должен быть - new String[] { "uid" }

person kayyagari    schedule 07.03.2012
comment
Благодарю за ваш ответ. но я попытался в соответствии с вашим предложением, но все равно не аутентифицируется. - person dip89; 09.03.2012
comment
Мне нужно увидеть ваш код, чтобы увидеть, что не так, можно ли опубликовать ваш код? - person kayyagari; 10.03.2012