使用Spring的LdapTemplate进行LDAP操作

转载 2013年12月03日 16:28:43
[转载声明] 转载时必须标注:本文来源于铁木箱子的博客http://www.mzone.cc
[本文地址] 本文永久地址是:http://www.mzone.cc/article/621.html

      最近利用空闲时间研究了一把LDAP,然后用spring进行了一些编程尝试,通过spring的LdapTemplate可以很方便的进行LDAP的CRUD操作。如果你不清楚啥是LDAP的话,可以查询相关资料后再看此文。一般来说LDAP可以用来作为一个用户中心,围绕LDAP可以部署一些应用来共享相同的账号,这个在企业管理中是非常有帮助的,因为企业的内部应用可能是几个到几十个,员工如果有统一的账号密码,那将非常方便。

      我也是因为内部需要,围绕LDAP做了一些应用集成,使用的LDAP服务器是apache的DS,标准的LDAP协议,客户端编程用java,使用spring的LdapTemplate类进行操作。使用maven管理的话,在项目中加入如下依赖:

  1. <dependency>
  2. <groupId>com.sun</groupId>
  3. <artifactId>ldapbp</artifactId>
  4. <version>1.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring-ldap</artifactId>
  9. <version>1.1.2</version>
  10. </dependency>

      然后就可以使用LDAP进行操作了,当然了也要加入其它的spring对应的包,比如core包等,下面分别说明使用spring的LdapTemplate如何进行操作。注意,在应用之前请先配置好apache-DS服务(请参考文章xxx)。

1、初始化LdapTemplate

  1. private static final LdapTemplate template;
  2.  
  3. static {
  4. LdapContextSource cs = new LdapContextSource();
  5. cs.setCacheEnvironmentProperties(false);
  6. cs.setUrl("ldap://192.168.1.188:10389");
  7. cs.setBase("dc=mzone,dc=cc");
  8. cs.setAuthenticationSource(new AuthenticationSource() {
  9. @Override
  10. public String getCredentials() {
  11. return "mzonecc";
  12. }
  13.  
  14. @Override
  15. public String getPrincipal() {
  16. return "uid=admin,ou=system";
  17. }
  18. });
  19. template = new LdapTemplate(cs);
  20. }

      初始化时主要是设置连接地址、基础目录(我们这里是dc=mzone,dc=cc)和认证信息(包括账号和密码)。注意认证信息中getCredentials返回的是密码信息,而getPrincipal方法返回的是账号DN(基于基础目录)。

2、查询(搜索)

      查询在LdapTemplate中是search说法,相关代码如下:

  1. public User getUserById(String uid) {
  2. String filter = "(&(objectclass=inetOrgPerson)(uid=" + uid + "))";
  3. List<User> list = template.search("ou=rd", filter, new AttributesMapper() {
  4. @Override
  5. public Object mapFromAttributes(Attributes attributes) throws NamingException {
  6. User user = new User();
  7.  
  8. Attribute a = attributes.get("cn");
  9. if (a != null) user.setRealname((String)a.get());
  10.  
  11. a = attributes.get("uid");
  12. if (a != null) user.setUsername((String)a.get());
  13.  
  14. return user;
  15. }
  16. });
  17. if (list.isEmpty()) return null;
  18. return list.get(0);
  19. }

      首先我们要构造一个filter,即search方法的第2个参数,这个filter是标准的LDAP查询过滤器,可以参考下LDAP的filter写法相关文档。

3、添加

  1. public boolean addUser(User vo) {
  2. try {
  3. // 基类设置
  4. BasicAttribute ocattr = new BasicAttribute("objectClass");
  5. ocattr.add("top");
  6. ocattr.add("person");
  7. ocattr.add("uidObject");
  8. ocattr.add("inetOrgPerson");
  9. ocattr.add("organizationalPerson");
  10. // 用户属性
  11. Attributes attrs = new BasicAttributes();
  12. attrs.put(ocattr);
  13. attrs.put("cn", StringUtils.trimToEmpty(vo.getRealname()));
  14. attrs.put("sn", StringUtils.trimToEmpty(vo.getUsername()));
  15. attrs.put("displayName", StringUtils.trimToEmpty(vo.getRealname()));
  16. attrs.put("mail", StringUtils.trimToEmpty(vo.getEmail()));
  17. attrs.put("telephoneNumber", StringUtils.trimToEmpty(vo.getMobile()));
  18. attrs.put("title", StringUtils.trimToEmpty(vo.getTitle()));
  19. attrs.put("userPassword", StringUtils.trimToEmpty(vo.getPassword()));
  20. template.bind("uid=" + vo.getUsername().trim(), null, attrs);
  21. return true;
  22. } catch (Exception ex) {
  23. ex.printStackTrace();
  24. return false;
  25. }
  26. }

      在LDAP中是没有添加这一说法的,标准的叫法是绑定,对应的删除就是解绑。绑定时要将所有必须属性都添加上,首先是objectClass属性,这个是LDAP中的对象,LDAP中的对象是继承的,每个对象都有一些特定的属性,有些属性是必须的,有些是可选的。第2个步骤就是将每个对象的必须属性和你想要的非必须属性填上交由LdapTemplate进行绑定即可。

4、更新

  1. public boolean updateUser(User vo) {
  2. try {
  3. template.modifyAttributes("uid=" + vo.getUsername().trim(), new ModificationItem[] {
  4. new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("cn", vo.getRealname().trim())),
  5. new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("displayName", vo.getRealname().trim())),
  6. new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("sn", vo.getUsername().trim())),
  7. new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("mail", vo.getEmail().trim())),
  8. new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("telephoneNumber", vo.getMobile().trim())),
  9. new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("title", vo.getTitle().trim()))
  10. });
  11. return true;
  12. } catch (Exception ex) {
  13. ex.printStackTrace();
  14. return false;
  15. }
  16. }

      更新就是替换属性,使用ModificationItem类进行处理。

5、删除

  1. public boolean deleteUser(String username) {
  2. try {
  3. template.unbind("uid=" + username.trim());
  4. return true;
  5. } catch (Exception ex) {
  6. ex.printStackTrace();
  7. return false;
  8. }
  9. }

      删除也就是解绑的过程,直接调用unbind即可。

      上面几个操作基本上就覆盖了LDAP的基本操作,对于查询可能更多的是要注意如何些filter,增加要确定objectClass。另外,如果在初始化LdapContextSource时设置了base,那么后面的LdapTemplate中所有的操作DN都是基于改base构建而成的全路径,这个要注意。其他来说,看看代码就知道怎么回事了,相对比较简单。

springLdap 操作ldap示例(增删改查)

在看这个文章之前,最好是了解了openldap的schema文件,也就是了解objectClass和attribute以及它们的关系。否则很容易不了解代码的含义以及抛出的异常。 实体类: ...
  • educast
  • educast
  • 2015年06月26日 21:41
  • 4134

springLdap 操作ldap示例(增删改查)

这部分的示例网上的确有很多,但是个人在查找的过程中还是感到不够满意,所以就自己总结一下,方便自己以后查阅,也方便其他童鞋查找资料。 springLdap 操作ldap示例(增删改查) 在看这个文章之前...
  • sundenskyqq
  • sundenskyqq
  • 2013年05月31日 20:44
  • 9274

【Spring】官网教程阅读笔记(四):使用LDAP对用户鉴权

【前言】再接再厉,LDAP鉴权或许能用到。本文给了两个application作为参照,第一个是普通的webApplication,没有用户鉴权,第二个有用户鉴权。如果看过第一篇,可以直接跳到第二个ap...
  • arctan90
  • arctan90
  • 2015年03月31日 10:55
  • 2594

LDAP分页查询

public List findTestData() throws  Exception{         AndFilter filter = new AndFilter();         ...
  • jbgtwang
  • jbgtwang
  • 2014年09月07日 23:44
  • 4274

Spring security 集成ldap服务,实现统一验证

先说一下Spring security 是基于spring的一个强大的安全验证模块,它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Invers...
  • liushuiwuyizhe
  • liushuiwuyizhe
  • 2015年08月21日 18:20
  • 1869

spring-ldap学习(一)

1、搭建ldap服务,我用的系统是Ubuntu14.04,具体可以参考这篇文章:ubuntu14.04搭建ldap服务,按照步骤来没什么问题。   安装之后访问地址为:http://10.8.12.1...
  • Victor_Cindy1
  • Victor_Cindy1
  • 2017年05月18日 15:39
  • 1240

利用Spring进行LDAP验证登录遇到的问题及其解决方式

有些系统需要使用公司内部的域帐号登录,那么就需要连接LDAP进行验证,Spring Secutiry提供了使用LDAP验证的方式(就相比登录验证来说,Spring提供的LDAP验证,比自己实现LDAP...
  • t894690230
  • t894690230
  • 2016年10月25日 22:47
  • 4046

使用Java操作LDAP案例

1 案例描述 公司平台使用LDAP来储存企业或用户的信息,在系统的运行过程中需要对LDAP存储的信息进行相关的访问和操作,那么在Java中是如何操作LDAP的呢? 2 案例分析 LDAP是一...
  • gm_163
  • gm_163
  • 2013年12月30日 15:27
  • 4357

Spring Security进阶——集成LDAP认证

如果对于这系列文章有疑问,可以先阅读以下链接内容(含Demo及源码下载):  Spring Security入门篇——搭建简易权限框架:http://www.javali.org/archive/g...
  • wei_ya_wen
  • wei_ya_wen
  • 2013年01月22日 11:09
  • 3471

liferay通过ldap同步用户([用户组])设置(一)

转自:http://blog.sina.com.cn/s/blog_472b9eb20100ni25.html
  • xyy511
  • xyy511
  • 2014年07月23日 09:41
  • 1278
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Spring的LdapTemplate进行LDAP操作
举报原因:
原因补充:

(最多只允许输入30个字)