Как манипулировать LDAP с помощью JNDI на веб-сфере? - PullRequest
0 голосов
/ 06 февраля 2012

У меня проблема с операцией LDAP.Я хочу динамически добавлять участника в группу LDAP при выборе пользователем из GUI / браузера.Я вставляю приведенный ниже код, который отлично работает, когда я запускаю его в классе Test (используя com.sun.jndi.ldap.LdapCtxFactory).Но когда я упаковываю его в свою сборку, развертываю на сервере приложений websphere 7.0 (используя com.ibm.websphere.naming.WsnInitialContextFactory) и вызываю этот метод в соответствии с выбором пользователя, я получаю сообщение об ошибке ниже.Интересно, что не так я делаю.Разве WAS не обеспечивает реализацию фабрики соединений ldap?Я также попытался развернуть WAS с помощью ldap от sun, который в противном случае работает в классе Test, но я получаю то же исключение, что и ниже.Я был бы признателен, если кто-нибудь может дать подсказку.

Проблема добавления члена: javax.naming.OperationNotSupportedException: [LDAP: код ошибки 53 - 00000561: SvcErr: DSID-031A120C, проблема 5003 (WILL_NOT_PERFORM), данные 0

My Code:

public class LDAPManager
{
    String GROUPS_OU =  "cn=users,dc=mit,dc=hq,dc=com";

    public Boolean addMember(String user, String group)
    {

        Hashtable env = new Hashtable();
        String adminName = "CN=Administrator,CN=Users,DC=mit,DC=hq,DC=com";
        String adminPassword = "asdfasdf21Q";
        String ldapURL = "ldap://mybox451Dev.mit.hq.com:389";
        String userName = "CN="+user+",CN=Users,DC=mit,DC=hq,DC=com";
        String groupName = "CN="+group+",CN=Users,DC=mit,DC=hq,DC=com";


        //env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");

        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");

        //set security credentials, note using simple cleartext authentication
        env.put(Context.SECURITY_AUTHENTICATION,"simple");
        env.put(Context.SECURITY_PRINCIPAL,adminName);
        env.put(Context.SECURITY_CREDENTIALS,adminPassword);

        //connect to my domain controller
        env.put(Context.PROVIDER_URL, "ldap://mybox451Dev.mit.hq.com:389");

        try {

            // Create the initial directory context
            InitialDirContext ctx = new InitialDirContext(env);

            //Create a LDAP add attribute for the member attribute
            ModificationItem mods[] = new ModificationItem[1];
            mods[0]= new ModificationItem(DirContext.ADD_ATTRIBUTE, new BasicAttribute("member", userName)); 

            //update the group
            ctx.modifyAttributes(groupName,mods);

            ctx.close();

            //System.out.println("Added " + userName + " to " + groupName);

        } 

        catch (NamingException e) {
            System.err.println("Problem adding member: " + e);
        }

        return true;
    }

}

Я понял это.Разместите здесь решение, надеюсь, это кому-нибудь поможет.

  1. Используйте стандартный JNDI-контекст солнца, а не веб-сферы.
  2. Дополнительные свойства, которые я пропустил в хеш-таблице, после добавления они работали как шарм.

    env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");  
    
    //env.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");  
    
    //set security credentials, note using simple cleartext authentication  
    env.put(Context.SECURITY_AUTHENTICATION,"simple");  
    env.put(Context.SECURITY_PRINCIPAL,adminName);  
    env.put(Context.SECURITY_CREDENTIALS,adminPassword);  
    env.put(Context.URL_PKG_PREFIXES, "com.sun.jndi.url");  
    env.put(Context.REFERRAL, "ignore");  
    

1 Ответ

0 голосов
/ 24 мая 2013

Ну, прошло больше года с тех пор, как был задан этот вопрос; Итак, я не знаю, ответ даст какую-то ценность. Но вот оно. См. WAS Javadocs для получения подробной информации о том, что на самом деле делает этот фабричный класс и как он работает. Возможно, вам придется настроить файл jndiprovider.properties для WAS.

...