package test2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.Properties;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.ModificationItem;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
public class Test {
public static DirContext dc; //相当于这个树的一个映像
public static void conn()
{
String dn="cn=Manager,dc=my-domain,dc=com"; //包括连接LDAP服务器的用户及要操作的根节点
Properties env = new Properties();
env.put(DirContext.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(DirContext.PROVIDER_URL, "ldap://localhost:" + 389);
if (dn != null) {
env.put(DirContext.SECURITY_PRINCIPAL, dn);
env.put(DirContext.SECURITY_CREDENTIALS, "secret");
}
try {
dc = new InitialDirContext(env);
System.out.println("连接成功");
} catch (NamingException e) {
e.printStackTrace();
}
}
public static void deleteInformation()
{
try {
dc.destroySubcontext("cn=mm,ou=ppeople,dc=my-domain,dc=com");
System.out.println("删除成功");
} catch (NamingException ne) {
ne.printStackTrace();
}
}
public static void addInformation()
{
try
{
Attributes attrs = new BasicAttributes();
attrs.put("uid", "alee");
attrs.put("sn","Lee");
attrs.put("telephoneNumber", "14085550017");
attrs.put("userPassword","redqueen".getBytes());
BasicAttribute objectclass = new BasicAttribute("objectclass");
objectclass.add("uidObject");
objectclass.add("person");
attrs.put(objectclass);
dc.createSubcontext("cn=mm,ou=ppeople,dc=my-domain,dc=com", attrs);
System.out.println("添加成功");
} catch (Exception ne) {
ne.printStackTrace();
System.out.println("添加失败");
}
}
public static void modifyInformation(String dn)
{
try {
ModificationItem[] mods = new ModificationItem[1];
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("sn", "qm"));// 所修改的属性
dc.modifyAttributes(dn,mods);
System.out.println("修改成功");
} catch (NamingException ne) {
ne.printStackTrace();
}
}
public static void search() {// 我只能按照某些属性查找节点,偶还不会怎么查找一个目录或按照更复杂的正则式查找特定节点/目录
try {
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
System.out.print("what would you want to search:");
BufferedReader bd = new BufferedReader(new InputStreamReader(System.in));
String s = bd.readLine();
NamingEnumeration en = dc.search("dc=my-domain,dc=com", "uid=" + s, constraints); // 要查询的UID。如果是*则可以查到所有UID的节点
if (en == null) {
System.out.println("Have no NamingEnumeration.");
}
if (!en.hasMoreElements()) {
System.out.println("Have no element.");
}
while (en != null && en.hasMoreElements()) {// 可以查出多个元素
Object obj = en.nextElement();
if (obj instanceof SearchResult) {
SearchResult si = (SearchResult) obj;
System.out.println("/tname: " + si.getName());
Attributes attrs = si.getAttributes();
if (attrs == null) {
System.out.println("/tNo attributes");
} else {
for (NamingEnumeration ae = attrs.getAll(); ae.hasMoreElements();) {// 获得该节点的所有属性
Attribute attr = (Attribute) ae.next();// 下一属性
String attrId = attr.getID();// 获得该属性的属性名
for (Enumeration vals = attr.getAll(); vals.hasMoreElements();) {// 获得一个属性中的所有属性值
System.out.print("/t/t" + attrId + ": ");
Object o = vals.nextElement();// 下一属性值
if (o instanceof byte[])
System.out.println(new String((byte[]) o));
else
System.out.println(o);
}
}
}
} else {
System.out.println(obj);
}
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
conn();
addInformation();
deleteInformation();
modifyInformation("uid=jdoe,ou=people,dc=my-domain,dc=com");
search();
try {
dc.close();
} catch (NamingException e) {
e.printStackTrace();
}
}
}