目录1.LDAP介绍2.LDAP相关概念3.LDAP使用4.示例演示LDAP简介LDAP是LightDirectoryAccessPortocol的缩写,轻量级目录访问协议目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它成树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。目录服务是由目录数据库和一套访问协议组成的系统LDAP简介-协议从协议衍化上阐述LDAP,它是“目录访问协议DAP——ISOX.500”的衍生,简化了DAP协议,提供了轻量级的基于TCP/IP协议的网络访问,降低了管理维护成本,但保持了强壮且易于扩充的信息框架。LDAP的应用程序可以很轻松的新增、修改、查询和删除目录内容信息。LDAP简介-用途从用途上阐述LDAP,它是一个存储静态相关信息的服务,适合“一次记录多次读取”公司的物理设备信息如打印机,它的IP地址、存放位置、厂商、购买时间等公开的员工信息地址、电话、电子邮件…合同和账号信息客户信息、产品交付日期、投标信息、项目信息…凭证信息认证凭证、许可证凭证…LDAP简介-数据结构从数据结构上阐述LDAP,它是一个树型结构,能有效明确的描述一个组织结构特性的相关信息。在这个树型结构上的每个节点,我们称之为“条目(Entry)”,每个条目有自己的唯一可区别的名称(DistinguishedName,DN)。条目的DN是由条目所在树型结构中的父节点位置(BaseDN)和该条目的某个可用来区别身份的属性(称之为RDN如uid,cn、ou)组合而成。LDAP存储的数据•适合存放在目录服务器中的数据需要经常读取而又较少更改的数据比较容易表示成由属性构成的数据需要在多个用户间共享的数据需要在不同的地点访问的数据•不适合存放目录服务器的数据需要经常更改数据量非常的大,结构化又非常的差例如文档,报告等无法用属性集合表示LDAP产品介绍厂商产品介绍SUNSUNONEDirectoryServer基于文本数据库的存储,速度快IBMIBMDirectoryServer基于DB2的的数据库,速度一般ORACLEOracleInternetDirectory基于oracle的的数据库,速度一般NovellNovellDirectoryServer基于文本数据库的存储,速度快,不常用到MicrosoftMicrosoftActiveDirectory基于WINDOWS系统用户,对大数据量管理速度不太理想,漏洞太多,但是实施简单OpensourceOpensourceOpenLDAP开源的项目,速度很快,但是非主流应用LDAP目录树的几个主要概念•目录树在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目•条目每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN),条目的DN是由条目所在树型结构中的父节点位置和该条目的某个可用来区别身份的属性组合而成。条目是由对象类、属性以及对应的值组成•对象类与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来•属性描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性LDAP目录树的几个主要概念关键字英文全称含义dcDomainComponent域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=comuidUserId用户ID,如“tom”ouOrganizationUnit组织单位,类似于Linux文件系统中的子目录,它是一个容器对象,组织单位可以包含其他各种对象(包括其他组织单元),如“market”cnCommonName公共名称,如“ThomasJohansson”snSurname姓,如“Johansson”dnDistinguishedName惟一辨别名,类似于Linux文件系统中的绝对路径,每个对象都有一个惟一的名称,如“uid=tom,ou=market,dc=example,dc=com”,在一个目录树中DN总是惟一的rdnRelativedn相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn=ThomasJohansson”LDAP目录树结构dc=comdc=cibcn=icfpcn=projectcn=usersou=organizationou=rootou=G0000001ou=999...999projectno=icfpprojectno=acrmcn=admincn=U000000001cn=U000000002ou=G0000003ou=G00000002ou=G0000004......LDAP目录树结构LDAP目录树分析对于条目”ou=G0000001”这个条目来说:它的全部路径FullDN是:“ou=G0000001,ou=root,ou=organization,cn=icfp,dc=cib,dc=com”父节点路径BaseDN是:“ou=root,ou=organization,cn=icfp,dc=cib,dc=com”相对RDN:“ou=G0000001”LDAP使用(1)连接到LDAP服务器(2)绑定到LDAP服务器匿名或作为特定用户(3)在LDAP服务器上执行所需的任何操作(4)释放LDAP服务器的连接LDAP使用-iCFP连接、绑定LDAP服务(1)JavaAPI操作LDAPJNDI(TheJavaNamingandDirectoryInterface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。(2)Spring操作LDAPSpringLDAP是一个用于操作LDAP的Java框架。它是基于Spring的JdbcTemplate模式。这个框架能够帮助开发人员简化lookingup,closingcontexts,encoding/decodingvalues与filters等操作。LDAP使用-连接LDAP服务•Javax.naming:包含了访问命名服务的类和接口。例如,它定义了Context接口,这是命名服务执行查询的入口。•Javax.naming.directory:这个包包含了对命名包的扩充,提供了访问目录服务的类和接口。例如,它为属性增加了新的类,提供了表示目录上下文的DirContext接口,定义了检查和更新目录对象的属性的方法。•Javax.naming.ldap:这个包提供了对LDAP版本3扩充的操作和控制的支持,通用包javax.naming.directory没有包含这些操作和控制。LDAP使用-连接LDAP服务Context是一套name-to-object的绑定(bindings),可以理解为层次或目录。在使用命名和目录服务时获得context是对整个名字空间操作的入口。在目录服务中使用DirContext及其实现类.对于名字服务由InitialContext开始,目录服务则使用InitialDirContextLDAP使用-连接LDAP服务javax.naming.directory.InitialDirContext,初始化目录服务上下文类该类是LDAP数据内容的操作工具类,通过该类可以执行绑定LDAP服务器、新增LDAP条目、获取条目实例、修改条目属性、删除条目和根据条件搜索条目等操作。Javax.naming.directory.DirContext是实现了Context接口的类。用这个类作为命名服务的入口。为了创建DirContext对象,构造器以java.util.Hashtable的形式设置一组属性。常用属性说明在使用JNDI之前,需要先获取JNDI的提供者,并在系统注册它。与JNDI相关的系统属性在javax.naming.Context中定义,常用的属性:•java.naming.factory.initial指定了JNDI服务提供者中工厂类(factoryclass)的名称。Factory负责为其服务创建适当的DirContext对象。FileSystemcom.sun.jndi.fscontext.RefFSContextFactoryLDAPcom.sun.jndi.ldap.LdapCtxFactoryRMIcom.sun.jndi.rmi.registry.RegistryContextFactoryCORBAcom.sun.jndi.cosnaming.CNCtxFactoryDNScom.sun.jndi.dns.DnsContextFactory属性说明java.naming.provider.url用来配置InitialContext的初始url对于目录服务,由于一般需要安全设置,还通常使用:java.naming.security.authentication安全类型,三个值:none,simple或strong。java.naming.security.principal认证信息。java.naming.security.credentials证书信息。iCFP连接LDAPSpringLDAP用SpringLDAP最小需要JAR包:spring-ldapspring-ldap包spring-core用于spring框架内部的工具类spring-beans操作javabeans的接口和类spring-context应用对象获取资源spring-dao数据访问、异常处理机制commons-logging简单的日志处理配置LDAP数据源!--LDAP连接信息--beanid=contextSourceclass=org.springframework.ldap.pool.factory.PoolingContextSourcepropertyname=contextSourceref=contextSourceTarget/propertyname=dirContextValidatorref=dirContextValidator/propertyname=testOnBorrowvalue=true/propertyname=testWhileIdlevalue=true/propertyname=testOnReturnvalue=true/propertyname=maxActivevalue=50//beanbeanid=contextSourceTargetclass=org.springframework.ldap.core.support.LdapContextSourcepropertyname=urlvalue=${ldap.url}/propertyname=userDnvalue=${ldap.username}/propertyname=passwordvalue=${ldap.password}/propertyname=pooledvalue=false//beanbeanid=dirContextValidatorclass=org.springframework.ldap.pool.validation.DefaultDirContextValidator/!--LDAPTemplate--beanid=ldapTemplateclass=org.springframework.ldap.core.LdapTemplateconstructor-argref=contextSource//bean使用SpringLDAP访问数据LDAP库beanid=userLdapServiceclass=com.cib.cap.ldap.use