操纵 LdapName(专有名称)

LDAP 以其字符串 表示形式使用专有名称(DN)。用于表示 DN 的字符串 格式在RFC 2253中指定。 DN 由称为相对专有名称(RDN)的组件组成。以下是 DN 的示例:

“ CN = John Smith,O = Isode Limited,C = GB”

它由以下 RDN 组成:

  • CN=John Smith

  • O=Isode Limited

  • C=GB

下面的类分别表示 DN 和 RDN。

LdapName 类实现的javax.naming.Nameinterface类似于javax.naming.CompoundNamejavax.naming.CompositeName类。

LdapName 和 Rdn 类允许轻松操作 DN 和 RDN。使用这些 API,可以通过将名称和值配对来构造 RDN。可以使用 RDN 列表构造 DN。类似地,可以从其字符串 表示中检索 DN 和 RDN 的各个组成部分。

LdapName

可以使用RFC 2253中定义的字符串 表示形式或 Rdns 列表创建 LdapName。使用前一种方法时,将根据 RFC2253 中定义的规则来解析指定的字符串。如果字符串 不是有效的 DN,则抛出InvalidNameException。这是一个使用构造函数来解析 LDAP 名称并打印其组件的示例。

String name = "cn=Mango,ou=Fruits,o=Food";
try {
    LdapName dn = new LdapName(name);
    System.out.println(dn + " has " + dn.size() + " RDNs: ");
    for (int i = 0; i < dn.size(); i++) {
        System.out.println(dn.get(i));
    }
} catch (InvalidNameException e) {
    System.out.println("Cannot parse name: " + name);
}

使用"cn=Mango,ou=Fruits,o=Food"Importing 运行此示例将产生以下结果:

cn=Mango,ou=Fruits,o=Food has 3 RDNs: 
o=Food
ou=Fruits
cn=Mango

LdapName 类包含一些方法,这些方法可以以 RDN 和字符串 的形式访问其组件,修改 LdapName,比较两个 LdapName 是否相等以及获取名称的字符串 表示形式。

访问 LDAP 名称的名称组成部分:

您可以使用以下方法来以 RDN 和字符串 的形式访问名称组件:

getRdn(int posn)
get(int posn)
getRdns()
getAll()
getPrefix(int posn)
getSuffix(int posn)
clone()

要检索 LdapName 中特定位置的组件,请使用 getRdn()或 get()。前面的构造函数示例显示了其用法示例。 getRdns()返回所有 RDN 的列表,而getAll()返回 LdapName 的所有组件作为枚举。

最右边的 RDN 在索引 0,最左边的 RDN 在索引 n-1.例如,专有名称"cn=Mango, ou=Fruits, o=Food"的编号 Sequences 为 0 到 2:\{o=Food, ou=Fruits, cn=Mango\}

您还可以获取 LdapNames 的后缀或前缀作为 LdapName 实例。这是一个example,它获取 LDAP 名称的后缀和前缀。

LdapName dn = new LdapName("cn=Mango, ou=Fruits, o=Food");
Name suffix = dn.getSuffix(1);  // 1 <= index < cn.size()
Name prefix = dn.getPrefix(1);  // 0 <= index < 1

运行此程序时,它将生成以下输出:

cn=Mango ou=Fruits
o=Food

要复制 LdapName,请使用 clone()。

修改 LDAP 名称

以下是可用于修改 LDAP 名称的方法:

add(Rdn rdn)
add(String comp)
add(int posn,字符串 补偿)
addAll(List suffixRdns)
addAll(Name suffix)
addAll(int posn,List suffixRdns)
addAll(int posn,名称后缀)
remove(int posn)

创建 LdapName 实例后,可以在其中添加和删除组件。这是一个example,它将 LdapName 附加到现有的 LdapName 上,在前面和后面添加组件,并删除第二个组件。

LdapName dn = new LdapName("ou=Fruits,o=Food");
     LdapName dn2 = new LdapName("ou=Summer");
     System.out.println(dn.addAll(dn2)); // ou=Summer,ou=Fruits,o=Food
     System.out.println(dn.add(0, "o=Resources")); 
// ou=Summer,ou=Fruits,o=Food,o=Resources
     System.out.println(dn.add("cn=WaterMelon")); 
// cn=WaterMelon,ou=Summer,ou=Fruits,o=Food,o=Resources
     System.out.println(dn.remove(1));  // o=Food
     System.out.println(dn);  
// cn=WaterMelon,ou=Summer,ou=Fruits,o=Resources

比较 LDAP 名称

以下是可用于比较两个 LDAP 名称的方法:

compareTo(Object name)
equals(Object name)
endsWith(List)
endWith(Name name)
startsWith(List rdns)
startsWith(Name name)
isEmpty()

您可以使用compareTo\(\)对 LdapName 实例列表进行排序。 equals\(\)方法使您可以确定两个 LdapName 在语法上是否相等。如果两个 LdapName 具有相同的 Sequences(完全匹配大小写),则它们相等。

使用startsWith\(\)endsWith\(\),您可以了解一个 LdapName 是另一个 LdapName 的开始还是结束。即,一个 LdapName 是另一个 LdapName 的后缀还是前缀。

便捷方法isEmpty\(\)使您能够确定 LdapName 是否具有零个分量。您也可以使用表达式size\(\) == 0执行相同的检查。

这是一个使用以下比较方法的示例CompareLdapNames

LdapName one = new LdapName("cn=Vincent Ryan, ou=People, o=JNDITutorial");
LdapName two = new LdapName("cn=Vincent Ryan");
LdapName three = new LdapName("o=JNDITutorial");
LdapName four = new LdapName("");

System.out.println(one.equals(two));        // false
System.out.println(one.startsWith(three));  // true
System.out.println(one.endsWith(two));      // true
System.out.println(one.startsWith(four));   // true
System.out.println(one.endsWith(four));     // true
System.out.println(one.endsWith(three));    // false
System.out.println(one.isEmpty());          // false
System.out.println(four.isEmpty());         // true
System.out.println(four.size() == 0);       // true

获取字符串 表示形式

以下方法为您提供根据 RFC 2253 中指定的语法格式设置的 LDAP 名称的字符串 表示形式:

toString()

当您使用 LdapName 构造函数时,您将提供 LDAP 名称的字符串 表示形式并获取 LdapName 实例。要执行相反的操作,即获取 LdapName 实例的字符串 表示形式,请使用toString\(\)toString\(\)的结果可以反馈给构造函数,以产生一个与原始 LdapName 实例相等的 LdapName 实例。这是一个示例LdapNametoString

LdapName dn = new LdapName(name);
String str = dn.toString();
System.out.println(str);
LdapName dn2 = new LdapName(str);
System.out.println(dn.equals(dn2));  // true

LdapName 作为上下文方法的参数

Context 方法要求将复合名称或复合名称作为参数传递给其方法。因此,LdapName 可以直接传递给上下文方法,如LookupLdapName所示:

// Create the initial context
Context ctx = new InitialContext(env);

// An LDAP name
LdapName dn = new LdapName("ou=People,o=JNDITutorial");

// Perform the lookup using the dn
Object obj = ctx.lookup(dn);

同样,当 Context 方法从 list(),listBindings()或 search()操作返回结果时,可以通过调用getNameInNamespace()来检索 DN。可以直接从 DN 构造 LdapName,如示例RetrievingLdapName所示:

while (answer.hasMore()) {
    SearchResult sr = (SearchResult) answer.next();
    String name = sr.getNameInNamespace();
    System.out.println(name);
    LdapName dn = new LdapName(name);

    // do something with the dn