使用JNDI在LDAP模式中添加新对象类

时间:2011-03-25 10:40:53

标签: java-ee ldap jndi

我编写了代码来在LDAP模式中添加对象类。它适用于SunOne目录服务。但是在OpenLdap的情况下它给出“InvalidAttributeValueException”,在IBM TDS的情况下给出“OperationNotSupportedException”。有没有人知道这3个目录服务的通用代码。

我的代码:

包演示;

import javax.naming。; import javax.naming.directory。; import java.util.Hashtable;

public class AddObjectClass {

public static void main(String args[])
{
    Hashtable env = new Hashtable(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL,"ldap://localhost:389");
    env.put(Context.SECURITY_AUTHENTICATION,"simple");
    env.put(Context.SECURITY_PRINCIPAL, "cn=Directory Manager");
    env.put(Context.SECURITY_CREDENTIALS,"cantsay");

    Attributes attrs = new BasicAttributes(true); // ignore case
    attrs.put("NUMERICOID", "1.3.6.1.4.1.42.2.27.4.2.3.1.1.45");
    attrs.put("NAME", "myObjectClass");
    attrs.put("DESC", "for JNDI example only");
    attrs.put("SUP", "top");
    attrs.put("STRUCTURAL", "true");
    Attribute must = new BasicAttribute("MUST", "cn");
    must.add("objectclass");
    attrs.put(must);

    try
    {
    DirContext ctx = new InitialDirContext(env);
    DirContext schema = ctx.getSchema("");
    schema.createSubcontext("ClassDefinition/myObjectClass", attrs);
    System.out.println("added");
    ctx.close();
    }catch(Exception e){e.printStackTrace();}

}

}

1 个答案:

答案 0 :(得分:0)

这是答案的开头。在LDAP V3 RFC上,记录了架构是动态的。这是您在 Sun one 中使用的内容。我在带有LDIF文件的 Active-Directory 中做了同样的事情。但是有一个技巧,你可以添加加载新属性,并在加载类之前在一个特殊属性中“重新加载模式”。

我只想告诉您,动态功能并不总是存在于所有LDAP V3目录中。当它存在时,它不是那么标准。

我无法谈论IBM TDS。但我确信,即使OpenLDAP能够支持动态模式,我使用的大多数分发都是在slapd启动期间加载的文本模式编译的。这些文本文件位于/ etc / openldap / schema /中。您必须重新启动deamon slapd才能使用新架构。

对于OpenLDAP,可能看看here

This article讨论了IBM TDS上的动态模式。

我希望它有所帮助。

JP