连接LDAP数据库CRUD,包括分页查询的持久层代码 |
package com.scnu.ytxt.persistence.sqlmapdao.user;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import org.springframework.ldap.AttributesMapper;
import org.springframework.ldap.CollectingNameClassPairCallbackHandler;
import org.springframework.ldap.LdapTemplate;
import org.springframework.ldap.support.DistinguishedName;
import org.springframework.ldap.support.control.PagedResultsRequestControl;
import org.springframework.ldap.support.filter.AndFilter;
import org.springframework.ldap.support.filter.EqualsFilter;
import com.scnu.ytxt.attribute.AttributeBuilder;
import com.scnu.ytxt.attribute.AttributeFather;
import com.scnu.ytxt.attribute.AttributeMapper;
import com.scnu.ytxt.persistence.iface.user.UserManageDao;
/**
* 用户管理DaoImpl
*
* @author Ray
*/
public class UserManageDaoImpl implements UserManageDao {
private LdapTemplate ldapTemplate;
/** objectClass类型 */
private static final String OBJECT_NAME = "user";
/** 节点名 */
private static final String BASE = "ou=user";
/** 所需要的类名称 */
private static final String ENTITY_CLASSNAME
= "com.scnu.ytxt.persistence.sqlmapdao.user.UserForLDAP";
/** 主键 */
private static final String PRIMARY_KEY = "userUid";
/** 最大页数 */
private static final int MAX_PAGE = 10000;
AttributeFather father = null;
AttributeBuilder builder = null;
AttributeMapper mapper = null;
public void setLdapTemplate(LdapTemplate ldapTemplate)
{
this.ldapTemplate = ldapTemplate;
}
/** 构造函数 */
public UserManageDaoImpl()
{
father = new AttributeFather(ENTITY_CLASSNAME);
builder = new AttributeBuilder();
mapper = new AttributeMapper();
}
/** 创建条目对应的DN */
public DistinguishedName getDN(Object parameterObject, String primaryKey,
String ouBase)
{
UserForLDAP userForLDAP = (UserForLDAP) parameterObject;
// 设置在ou=user下查找对象
DistinguishedName newContactDN = new DistinguishedName(ouBase);
// 设置需要删除的条目的DN
newContactDN.add(primaryKey, userForLDAP.getUserUid());
return newContactDN;
}
/** 添加 */
public int addUser(final Object parameterObject)
{
try
{
// 获取用户传来的属性集
Attributes attri = builder.getUserAttrs(parameterObject,
OBJECT_NAME);
DistinguishedName newContactDN = getDN(parameterObject,
PRIMARY_KEY, BASE);
// 把新条目绑定到LDAP
ldapTemplate.bind(newContactDN, null, attri);
// 参数说明("userUid=liling,ou=user" , null(绑定对象) , 要添加的字段集)
return 1;
}
catch (Exception e)
{
System.out.println("异常:" + e);
return 0;
}
}
/** 删除 */
public int delUser(final Object parameterObject)
{
DistinguishedName newContactDN
= getDN(parameterObject, PRIMARY_KEY,BASE);
try
{
// 进行删除,其中true表示同时删除其孩子结点
ldapTemplate.unbind(newContactDN, true);
return 1;
}
catch (Exception e)
{
return 0;
}
}
/** 修改 */
public int updateUserInfo(final Object parameterObject, String updateType)
{
// 获取用户传来的属性集
Attributes attri = builder.getUserAttrs(parameterObject,
OBJECT_NAME);
DistinguishedName newContactDN = getDN(parameterObject, PRIMARY_KEY,
BASE);
try
{
ldapTemplate.rebind(newContactDN, null, attri);
// 参数说明("userUid=liling,ou=user" , null , 要添加的字段值)
return 1;
}
catch (Exception e)
{
return 0;
}
}
/** 查询 */
public List getUserInfo(final Object parameterObject, int curPage,
int pageSize)
{
// 用于存储条目列表
List list = new ArrayList();
long starTime = System.currentTimeMillis();
// 设置filter
String filter = "objectclass=" + OBJECT_NAME;
// 声明搜索控件
SearchControls searchControls = new SearchControls();
// 指定检索范围
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
/*
* 0:OBJECT_SCOPE,搜索指定的命名对象。
* 1:ONELEVEL_SCOPE,只搜索指定命名对象的一个级别,这是缺省值。
* 2:SUBTREE_SCOPE,搜索以指定命名对象为根结点的整棵树
*/
// 声明属性名集合,并由Map类型转换为String类型数组
Map attriMap = father.getAttriName();
String returnedAtts[] = new String[attriMap.size()];
for (int i = 0, size = attriMap.size(); i < size; i++)
{
returnedAtts[i] = (String) (attriMap.get(i));
}
// 设置要返回的属性,即所有
searchControls.setReturningAttributes(returnedAtts);
// 设置handler,handler里存储了条目的list
CollectingNameClassPairCallbackHandler handler
= ldapTemplate.new AttributesMapperCallbackHandler(mapper);
// 设置页面大小
PagedResultsRequestControl requestControl
= new PagedResultsRequestControl(pageSize);
// 分为两种情况,第一种只取第一页,第二种取其他页数
if (curPage == 1)
{
try
{
// 只获取第一页
ldapTemplate.search(BASE, filter, searchControls, handler,
requestControl);
list = handler.getList();
}
catch (Exception e)
{
System.out.println("分页查询异常1" + e);
}
}
else
{
try
{
// 按分页搜索,并将结果存进handler,这里获取第一页
ldapTemplate.search(BASE, filter, searchControls, handler,
requestControl);
// 循环获取其余的页数,直至目标页
for (int i = 0, cur_1 = curPage - 1, cur_2 = curPage - 2; i < cur_1; i++)
{
// 声明临时变量handlerTemp。用于每次存储该次搜索的页面信息
CollectingNameClassPairCallbackHandler handlerTemp
= ldapTemplate.new AttributesMapperCallbackHandler(mapper);
// 设置页面大小
requestControl = new PagedResultsRequestControl(pageSize,
requestControl.getCookie());
// 在上次查询的基础上继续往后查询
ldapTemplate.search(BASE, filter, searchControls,
handlerTemp, requestControl);
// 检测为当前页,获取当前页的条目列表
if (i == cur_2)
list = handlerTemp.getList();
}
long endTime = System.currentTimeMillis();
System.out.println("查询所用时间:" + (endTime - starTime));
}
catch (Exception e)
{
System.out.println("分页查询异常2" + e);
}
}
return list;
}
/** 查询表的行数 */
public int getUserTotal(final Object parameterObject) {
long starTime = System.currentTimeMillis();
// 条目列表
List list = null;
// 设置filter
String filter = "objectclass=" + OBJECT_NAME;
// 声明搜索控件
SearchControls searchControls = new SearchControls();
// 指定检索范围
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
// 0:OBJECT_SCOPE,搜索指定命名的对象。1:ONELEVEL_SCOPE,只搜索指定命名对象的一个级别,这是缺省值。2:SUBTREE_SCOPE,搜索指定命名对象的子树,包括指定的命名对象
// 声明属性名集合,并转换为String数组
// 不返回属性对
searchControls.setReturningAttributes(null);
// 设置handler,handler里存储了条目的list
CollectingNameClassPairCallbackHandler handler
= ldapTemplate.new AttributesMapperCallbackHandler(mapper);
// 设置页面大小
PagedResultsRequestControl requestControl
= new PagedResultsRequestControl(MAX_PAGE);
try
{
// 只获取第一页
ldapTemplate.search(BASE, filter, searchControls, handler,
requestControl);
list = handler.getList();
long endTime = System.currentTimeMillis();
System.out.println("获得记录数所用时间:" + (endTime - starTime));
}
catch (Exception e)
{
System.out.println("分页查询异常1" + e);
}
return list.size();
}
/** 查询指定记录 */
public Object getUserInfoById(final Object parameterObject) {
// 条目列表
List list = null;
try
{
UserForLDAP userForLDAP = (UserForLDAP) parameterObject;
// 过滤器
AndFilter andFilter = new AndFilter();
andFilter.and(new EqualsFilter("objectclass", OBJECT_NAME));
// 添加userUid的过滤器设置
if (userForLDAP.getUserUid() != "")
andFilter.and(new EqualsFilter(PRIMARY_KEY, userForLDAP.getUserUid()));
else
return null;
// 进行检索
list = ldapTemplate.search(BASE, andFilter.encode(),mapper);
}
catch (Exception e)
{
System.out.println("查询指定记录异常" + e);
}
return list;
}
}
分享到:
相关推荐
压缩包中的`LdapDemo`可能是示例代码或测试用例,通常会包含如何设置分页控制项、执行查询、处理返回结果以及管理分页Cookie的代码片段。通过分析这些代码,我们可以深入理解在实际开发中如何解决LDAP分页问题。 总...
在IT领域,LDAP(Lightweight Directory Access ...实践中,结合具体的业务需求和LDAP目录结构,调整代码以满足特定场景的需求。阅读和理解Net::LDAP模块的文档以及相关的Perl LDAP教程,将有助于进一步提升你的技能。
使用这些jar包,开发者可以像操作数据库一样对LDAP目录进行操作,包括查询、插入、更新和删除数据。例如,你可以编写Java代码,创建一个JDBC连接,然后执行SQL-like的查询来查找 LDAP 目录中的用户信息。这对于那些...
### 基于关系数据库的LDAP证书查询服务器的实现 #### 概述 随着网络通信技术的迅速发展,网络安全已成为互联网应用中不可忽视的关键因素。公钥基础设施(Public Key Infrastructure, PKI)作为保障网络通信安全的...
`TADOConnection`和`TADODataset`等组件是Delphi与数据库交互的基础,但它们并不直接支持LDAP。因此,通常会使用第三方组件如`ldap4delphi`或`Indy`库中的`TIdLDAP`来实现LDAP连接。 在Delphi中连接到LDAP服务器,...
Java 连接和验证 LDAP 文档 Java 连接和验证 LDAP 文档是一份关于 Java 语言连接和验证 LDAP 服务器的学习文档。LDAP(Lightweight Directory Access Protocol)是一种目录访问协议,用于管理和访问目录服务中的...
**LDAP搭建及其Java代码连接** LDAP(Lightweight Directory Access Protocol)是一种轻量级目录访问协议,主要用于存储和检索用户信息、组织结构等元数据。它采用层次化的树状结构,便于管理和查找。在IT领域,...
1. **连接 LDAP 服务器**:LDAP 编辑器能够连接到各种 LDAP 服务器,包括但不限于 OpenLDAP、Active Directory、Novell eDirectory 等。它支持多种认证方式,如简单认证、Kerberos、证书等,确保安全的连接。 2. **...
django-ldapdb, Django ldapdb,用于 Django的LDAP数据库后端 django-ldapdb django-ldapdb 是用于 Django的LDAP数据库后端,允许通过 Django 模型操作LDAP条目。它支持大多数与 Django 模型相同的api:MyModel.o
1. **JNDI(Java Naming and Directory Interface)**:Java连接LDAP的基础是JNDI,它为Java应用程序提供了一个统一的接口来访问不同的命名和目录服务,包括LDAP。JNDI允许开发者以一致的方式查找、绑定、更新和管理...
这个主题涉及几个关键知识点,包括Java LDAP API、SSL安全连接以及如何通过代码操作LDAP目录。 首先,LDAP是一个开放标准的协议,用于存储和检索用户、组、计算机等对象的数据。这些数据通常分布在多台服务器上,...
**LDAP 连接工具详解与应用** LDAP(Lightweight Directory Access Protocol)是一种网络协议,用于在互联网上查询和管理分布式目录服务。它提供了一种高效、简洁的方式,使得用户能够检索和更新存储在目录服务器中...
Spring Boot 连接LDAP是实现LDAP增删改查操作的重要方法,本文将详细介绍Spring Boot 连接LDAP的方法,包括使用ODM快速实现LDAP增删改查操作、配置Spring LDAP连接信息、创建实体类作为LDAP中的entry映射等。...
在编写代码时,可以使用JDBC的`DriverManager.getConnection()`方法来建立与Oracle数据库的连接,而使用Oracle LDAP客户端库则需要调用相应的API来执行LDAP操作。 总结来说,这个压缩包提供的是连接Oracle 9i数据库...
总的来说,Java通过JNDI连接到LDAP服务器涉及以下几个关键步骤:初始化上下文、配置连接属性、建立连接、执行查询和操作目录对象,以及关闭连接。这些步骤在提供的源代码中可能会有所体现,通过分析这些类文件,可以...
Open LDAP基于Berkeley DB作为其后端数据库,提供了一个标准的LDAP接口,用于查询和修改目录信息。它支持多种认证机制,包括简单的明文密码、SSL/TLS加密以及更复杂的认证方式,如Kerberos。 **二、Open LDAP的安装...
这两种方法都可以实现分页查询,但JNDI更常见于轻量级应用,而JDBC-AD适合于需要数据库样式的查询操作。 在描述中提到的`ADConnectTest.java`文件可能是一个示例代码,用于演示如何通过编程方式执行AD分页查询。...
LdapBrowser是一款专为开放源代码的OpenLDAP设计的连接工具,帮助管理员便捷地浏览、编辑和管理LDAP目录。 **一、LdapBrowser的功能特性** 1. **图形化界面**:LdapBrowser提供了直观的图形用户界面,使得非技术...
**LDAP(Lightweight Directory Access Protocol)连接工具是用于管理和访问 LDAP 目录服务的重要软件,它使得用户可以方便地查询、编辑和管理存储在 LDAP 服务器中的数据。ApacheDirectoryStudio 是一个开源、跨...