如何在websphere上使用JNDI操作LDAP?

时间:2012-02-06 11:04:36

标签: ldap websphere jndi

我遇到LDAP操作问题。当用户从GUI /浏览器中选择时,我想动态地将成员添加到LDAP组。我粘贴下面的代码,当我在Test类中运行它时(使用com.sun.jndi.ldap.LdapCtxFactory),它可以很好地工作。但是,当我将其打包到我的构建中时,在websphere app server 7.0上部署(使用com.ibm.websphere.naming.WsnInitialContextFactory),并根据用户的选择调用此方法,然后我收到以下错误。我想知道我在做什么是错的。是不是提供了ldap连接工厂的实现?我也尝试使用sun的ldap在WAS上部署,否则它将在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. 使用sun的标准JNDI上下文,而不是websphere。
  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 :(得分:0)

嗯,自问这个问题以来已经一年多了;所以,我不知道回答会增加任何价值。但是,在这里。有关该工厂类实际如何工作以及工作原理的详细信息,请参阅WAS Javadocs。您可能需要为WAS调整jndiprovider.properties文件。