使用Spring的LdapTemplate进行LDAP操作
?
? ?然后就可以使用LDAP进行操作了,当然了也要加入其它的spring对应的包,比如core包等,下面分别说明使用spring的LdapTemplate如何进行操作。注意,在应用之前请先配置好apache-DS服务(请参考文章xxx)。?
?
private static final LdapTemplate template; static { LdapContextSource cs = new LdapContextSource(); cs.setCacheEnvironmentProperties(false); cs.setUrl("ldap://192.168.1.188:10389"); cs.setBase("dc=mzone,dc=cc"); cs.setAuthenticationSource(new AuthenticationSource() { @Overridepublic String getCredentials() { return "mzonecc";} @Overridepublic String getPrincipal() { return "uid=admin,ou=system";} }); template = new LdapTemplate(cs);}?public User getUserById(String uid) { String filter = "(&(objectclass=inetOrgPerson)(uid=" + uid + "))"; List<User> list = template.search("ou=rd", filter, new AttributesMapper() { @Overridepublic Object mapFromAttributes(Attributes attributes) throws NamingException { User user = new User(); Attribute a = attributes.get("cn"); if (a != null) user.setRealname((String)a.get()); a = attributes.get("uid"); if (a != null) user.setUsername((String)a.get()); return user;} }); if (list.isEmpty()) return null; return list.get(0);}?
public boolean addUser(User vo) { try { // 基类设置BasicAttribute ocattr = new BasicAttribute("objectClass");ocattr.add("top");ocattr.add("person");ocattr.add("uidObject");ocattr.add("inetOrgPerson");ocattr.add("organizationalPerson");// 用户属性Attributes attrs = new BasicAttributes();attrs.put(ocattr);attrs.put("cn", StringUtils.trimToEmpty(vo.getRealname()));attrs.put("sn", StringUtils.trimToEmpty(vo.getUsername()));attrs.put("displayName", StringUtils.trimToEmpty(vo.getRealname()));attrs.put("mail", StringUtils.trimToEmpty(vo.getEmail()));attrs.put("telephoneNumber", StringUtils.trimToEmpty(vo.getMobile()));attrs.put("title", StringUtils.trimToEmpty(vo.getTitle()));attrs.put("userPassword", StringUtils.trimToEmpty(vo.getPassword()));template.bind("uid=" + vo.getUsername().trim(), null, attrs);return true; } catch (Exception ex) {ex.printStackTrace();return false; }}?
?
public boolean updateUser(User vo) { try {template.modifyAttributes("uid=" + vo.getUsername().trim(), new ModificationItem[] { new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("cn", vo.getRealname().trim())), new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("displayName", vo.getRealname().trim())), new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("sn", vo.getUsername().trim())), new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("mail", vo.getEmail().trim())), new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("telephoneNumber", vo.getMobile().trim())), new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("title", vo.getTitle().trim()))});return true; } catch (Exception ex) {ex.printStackTrace();return false; }}?
?
public boolean deleteUser(String username) { try {template.unbind("uid=" + username.trim());return true; } catch (Exception ex) {ex.printStackTrace();return false; }}?
?
删除也就是解绑的过程,直接调用unbind即可。
?
?????
????? 上面几个操作基本上就覆盖了LDAP的基本操作,对于查询可能更多的是要注意如何些filter,增加要确定objectClass。另外,如果在初始化LdapContextSource时设置了base,那么后面的LdapTemplate中所有的操作DN都是基于改base构建而成的全路径,这个要注意。其他来说,看看代码就知道怎么回事了,相对比较简单。