最近利用空闲时间研究了一把LDAP,然后用spring进行了一些编程尝试,通过spring的LdapTemplate可以很方便的进行LDAP的CRUD操作。如果你不清楚啥是LDAP的话,可以查询相关资料后再看此文。一般来说LDAP可以用来作为一个用户中心,围绕LDAP可以部署一些应用来共享相同的账号,这个在企业管理中是非常有帮助的,因为企业的内部应用可能是几个到几十个,员工如果有统一的账号密码,那将非常方便。
我也是因为内部需要,围绕LDAP做了一些应用集成,使用的LDAP服务器是apache的DS,标准的LDAP协议,客户端编程用java,使用spring的LdapTemplate类进行操作。使用maven管理的话,在项目中加入如下依赖:
<dependency>
<groupId>com.sun</groupId>
<artifactId>ldapbp</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-ldap</artifactId>
<version>1.1.2</version>
</dependency>
然后就可以使用LDAP进行操作了,当然了也要加入其它的spring对应的包,比如core包等,下面分别说明使用spring的LdapTemplate如何进行操作。注意,在应用之前请先配置好apache-DS服务(请参考文章xxx)。
1、初始化LdapTemplate
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() {
@Override
public String getCredentials() {
return "mzonecc";
}
@Override
public String getPrincipal() {
return "uid=admin,ou=system";
}
});
template = new LdapTemplate(cs);
}
初始化时主要是设置连接地址、基础目录(我们这里是dc=mzone,dc=cc)和认证信息(包括账号和密码)。注意认证信息中getCredentials返回的是密码信息,而getPrincipal方法返回的是账号DN(基于基础目录)。
2、查询(搜索)
查询在LdapTemplate中是search说法,相关代码如下:
public User getUserById(String uid) {
String filter = "(&(objectclass=inetOrgPerson)(uid=" + uid + "))";
List<User> list = template.search("ou=rd", filter, new AttributesMapper() {
@Override
public 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);
}
首先我们要构造一个filter,即search方法的第2个参数,这个filter是标准的LDAP查询过滤器,可以参考下LDAP的filter写法相关文档。
3、添加
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;
}
}
在LDAP中是没有添加这一说法的,标准的叫法是绑定,对应的删除就是解绑。绑定时要将所有必须属性都添加上,首先是objectClass属性,这个是LDAP中的对象,LDAP中的对象是继承的,每个对象都有一些特定的属性,有些属性是必须的,有些是可选的。第2个步骤就是将每个对象的必须属性和你想要的非必须属性填上交由LdapTemplate进行绑定即可。
4、更新
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;
}
}
更新就是替换属性,使用ModificationItem类进行处理。
5、删除
public boolean deleteUser(String username) {
try {
template.unbind("uid=" + username.trim());
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
上面几个操作基本上就覆盖了LDAP的基本操作,对于查询可能更多的是要注意如何些filter,增加要确定objectClass。另外,如果在初始化LdapContextSource时设置了base,那么后面的LdapTemplate中所有的操作DN都是基于改base构建而成的全路径,这个要注意。其他来说,看看代码就知道怎么回事了,相对比较简单。
相关推荐
例如,你可以创建一个`test.ldif`文件,用来导入测试用户数据,然后在测试类中使用`LdapTemplate`进行数据导入。 最后,记得在你的Spring Boot应用启动类中启用LDAP自动配置,并根据需要实现自定义逻辑,如认证、...
3. **LdapTemplate**: 这是Spring LDAP的主要操作类,它封装了对目录的操作,提供了安全、方便的API进行查询和更新。 **Spring LDAP的使用步骤** 1. **配置ContextSource**: 在Spring配置文件中定义一个...
通过使用Spring LDAP,开发人员可以避免直接处理复杂的LDAP API,而是通过更简洁、面向对象的方式进行数据的检索、更新和管理。 ### 关键概念 #### 1. LdapTemplate `LdapTemplate`是Spring LDAP的核心组件之一,...
3. 使用Spring LDAP进行数据操作: - 查询:使用`LdapTemplate`的`find`或`search`方法,配合过滤器(例如,基于用户名、属性值等)来检索目录中的条目。 - 添加:通过`LdapTemplate`的`bind`方法可以将新的LDAP...
3. **强大的查询支持**:通过LdapTemplate类,开发者可以使用XPath或LDIF(LDAP Data Interchange Format)进行复杂查询,同时提供了安全性和性能优化。 4. **事务管理**:Spring LDAP 支持LDAP操作的事务管理,使得...
目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力。目录一般不支持通用数据库针对大量更新操作操作需要的复杂...
这个项目是为了简化 LDAP 数据的集成,提供了一种与 Spring 框架无缝集成的方式,使得开发人员能够更容易地进行数据查询、存储和操作。 **一、Spring-Ldap 的核心概念** 1. **ContextSource**: 它是 Spring-Ldap ...
本示例项目 "spring-ldap demo" 提供了一个关于如何使用 Spring LDAP 进行实际操作的详细教程,包括与 LDAP 目录的增删查改操作,并结合了 EXT.js 进行前端展示。 首先,我们来了解一下 Spring LDAP 的核心概念。...
在本篇博客“spring ldap操作(一)目录测试环境搭建”中,我们将深入探讨如何在Java应用程序中使用Spring LDAP框架来操作LDAP(轻量级目录访问协议)服务器,以及如何搭建一个测试环境来验证和调试相关功能。...
Spring LDAP 是一个强大的框架,它允许开发者利用Java与 Lightweight Directory Access Protocol (LDAP) 服务器进行交互。这篇博客文章“使用 Spring LDAP 读取数据并映射到 Java Bean 中”主要探讨了如何通过Spring...
在本文中,我们将探讨如何使用Spring框架来实现LDAP(轻量级目录访问协议)域认证。这是一项重要的技术,特别是对于那些希望集中管理和验证多个应用系统账号密码的企业而言。通过集成Spring与LDAP,我们可以实现一个...
3. 安全监控:结合Spring Security的日志和审计功能,可以对LDAP相关的操作进行监控,提高系统的安全性。 六、优化与最佳实践 1. 连接池:为了提高性能,可以配置连接池,减少与LDAP服务器的频繁交互。 2. 错误处理...
Spring Boot 连接LDAP是实现LDAP增删改查操作的重要方法,本文将详细介绍Spring Boot 连接LDAP的方法,包括使用ODM快速实现LDAP增删改查操作、配置Spring LDAP连接信息、创建实体类作为LDAP中的entry映射等。...
该框架结合了Spring的强大功能和LDAP的目录服务,使得开发人员可以更加方便地进行身份验证、授权以及其他与目录相关的操作。 **一、Spring LDAP基础** 1. **集成性**:Spring LDAP 将 LDAP 操作与 Spring 应用程序...
5. **Spring Security与LDAP集成**:Spring Security提供了`LdapContextSource`和`LdapTemplate`等工具类,便于与LDAP服务器交互。通过配置XML或Java配置,可以设置连接参数,如URL、基础DN(Distinguished Name)、...
这个"springldap例子"可能是为了展示如何配置和使用Spring LDAP进行开发。让我们深入了解一下Spring LDAP以及如何在实际项目中应用它。 Spring LDAP是一个模块化的框架,它为开发人员提供了在Java应用中集成LDAP...
本篇文章将深入探讨如何在Spring MVC项目中集成并使用LDAP进行用户身份验证和管理。 首先,理解LDAP的基本概念至关重要。LDAP目录服务是一种基于树形结构的数据存储,其中每个条目都有唯一的标识符(DN,...
例如,可以在Web应用中使用Spring LDAP进行用户验证,同时利用Spring JDBC处理数据库操作。 总之,Spring LDAP 1.3.0为开发者提供了一种高效、灵活且易于使用的途径,以便在Java应用程序中集成和操作 LDAP 服务。...
通过`LdapTemplate`进行CRUD操作,结合Spring Security的`LdapAuthenticationProvider`进行用户验证,可以构建安全、高效的LDAP集成系统。在实际项目中,这些功能可以极大地提高开发效率并确保数据管理的一致性和...
Spring LDAP使得开发者可以使用熟悉的Spring编程风格来处理LDAP操作,简化了与目录服务器的交互。 ### JNDI概述 JNDI是一个API,用于访问多种命名和目录服务。在Java应用中,JNDI常用来查找和绑定资源,如数据源、...