OpenLDAP使用疑惑解答及使用Java完成LDAP身份认证_第1页
OpenLDAP使用疑惑解答及使用Java完成LDAP身份认证_第2页
OpenLDAP使用疑惑解答及使用Java完成LDAP身份认证_第3页
OpenLDAP使用疑惑解答及使用Java完成LDAP身份认证_第4页
OpenLDAP使用疑惑解答及使用Java完成LDAP身份认证_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

导读LDAP(轻量级目录访问协议,LightweightDirectoryAccessProtocol)是实现提供被称为目录服务的信息服务。目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力。目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略。而目录服务的更新则一般都非常简单。这种目录可以存储包括个人信息、web链结、jpeg图像等各种信息。为了访问存储在目录中的信息,就需要使用运行在TCP/IP之上的访问协议一LDAP。LDAP目录中的信息是是按照树型结构组织,具体信息存储在条目(entry)的数据结构中。常见的例子是通讯簿,由以字母顺序排列的名字、地址和电话号码组成。目录服务与关系数据库之间的主要区别在于:二者都允许对存储数据进行访问,只是目录主要用于读取,其查询的效率很高,而关系数据库则是为读写而设计的。也就是目录服务不适于进行频繁的更新,属于典型的分布式结构。总结:对于查询操作多于更新操作的(认证)系统来说,使用OpenLDAP是一个比关系数据库如MySq、PostgreSQL等更好的选择。LDAP的功能在LDAP的功能模型中定义了一系列利用LDAP协议的操作,主要包含以下4部分:查询操作:允许查询目录和取得数据,其查询性能比关系数据库好。更新操作:目录的更新操作没关系数据库方便,更新性能较差,但也同样允许进行添加、删除、修改等操作。复制操作:前面也提到过,LDAP是一种典型的分布式结构,提供复制操作,可将主服务器的数据的更新复制到设置的从服务器中。认证和管理操作:允许客户端在目录中识别自己,并且能够控制一个会话的性质。而本文所要将的OpenLDAP就是一个优秀的开源的LDAP实现。OpenLDAP安装配置及疑惑解答1.安装和配置1.安装和配置OpenLDAP=1安装软件非常简单,但在配置过程中遇到了不少坎坷,不是服务启动不成功就是验证不成功。具体的安装和配置方法网上一大把,但都参差不齐,主要是因为新旧版本的OpenLDAP不同,配置方法有很大的改动。下面给出网上几个还算靠谱的Linux和Windows两个平台下安装该软件的方法:ubuntu安装LDAP:安装方法靠谱,但配置说的不太清楚,配置注意事项看后面。UbuntuOpenLDAPServer:官方教程,最值得借鉴,是英文的,这里有中文版的,但没英文的清晰,说的比较简单。Linux下安装openldap:二进制包安装方法,适用于非Ubuntu的Linux系统,稍微有点麻烦,在安装OpenlDAP之前还需要安装BerkeleyDB,但配置灵活,可以自定义安装路径什么的。后面的配置也没说清楚,主要看安装方法。Linux服务器部署系列之七一OpenLDAP篇:另一篇较详细的二进制安装方法及配置。Windows下OpenLDAP的安装及使用:介绍了LDAP的一些基础知识和Windows下安装方法。图文介绍openLDAP在windows上的安装配置:比较详细,值得一看。上面给出的这几个链接虽然还不错,但还是欠缺了些什么?对,就是讲解,网上给出的教程都是手把手教你如何安装和配置,而没有说明版本差异、具体配置的含义及为什么这样配置,如果因为版本或环境差异,你按其方法配置不成功,你也不知道哪里出的问题,因此建议还是先熟悉LDAP的基础知识,配置文件含义然后再试着安装。2.OpenLDAP疑惑解答下面根据我自己的经验,给出几个安装和配置注意事项,供参考。疑惑1:细心的人会发现有的教程说要配置主机DNS,添加与LDAP相关的域名,而大部分教程都没有提及这个,那么到底要不要配置呢?解答:当然需要配置。安装好OpenLDAP后首先需要配置slapd.conf这个文件,其中里面有suffix "dc=example,dc=com"这样一句需要自己配置,这两个dc代表什么意思呢?其实dc就是“domainComponent”也就是域名的组成部分,准确的说是主机域名的后缀组成部分,如果这里的配置与你的主机域名不对应的话,服务一般是启动不了的。那么怎么配置域名呢?Linux和Windows下的配置文件如下:Linux下:/etc/hostsWindows下:C:\Windows\System32\drivers\etc\hosts需要在hosts文件里添加一条域名(如果没配置的话),格式如下:hostname比如我的主机名是min,并添加的域名配置是:min那么相应的我就需要在slapd.conf里这样配置suffix:suffix "dc=alexia,dc=cn"当然这里域名后缀不一定只有两级,也可以是,然后suffix就应该是“dc=example,dc=com,dc=cn”,这随便你怎么设置了,只要对应就行。疑惑2:很多版本的slapd.conf里默认都配置了下面两个变量:modulepath /usr/lib/ldapmoduleload back_@BACKEND@这是什么意思?需要改动吗?解答:这是数据库database的backend,一般slapd.conf里配置的database都是bdb,也就是BerkeleyDB,有的也许是hdb,其实也是BerkeleyDB,只是两个不同的存储引擎(就像Mysql有MyISAM和InnoDB两个不同的存储引擎一样)。而modulepath和moduleload指定了动态模块路径及动态装载的后端模块,因为OpenLDAP默认是用BerkeleyDB存储数据的,如果你有动态的数据需要装载,那么就需要配置这两个参数,对于一般用户将这两个注释掉即可。疑惑3:OpenLDAP默认采用BerkeleyDB存储数据,那么可以换用其它的关系数据库吗?具体如何配置呢?解答:当然可以。首先需要明确ldap数据模型来自RDBMS(关系数据库模型),而并没有指定一定是哪个DB,只要是关系数据库都可以作为LDAP的后台,那么你为什么会想用其它的数据库代替自带的BerkeleyDB呢?我想可能是性能相关了,对于少量数据你用哪个都可以,但若涉及到稍大点的数据,比如成千上万的用户查询,那么BerkeleyDB的性能就不可观了,而且BerkeleyDB管理起来也不太方便,毕竟对这个数据库熟悉的人不多,如果能换作我们经常使用的数据库,不仅性能得到提升,管理起来也十分容易,岂不是一举多得。具体怎么配置了,请参考这篇文章:用postgresql作后台的openldap,以PostgreSQL作为例子进行讲解。疑惑4:新旧版本的OpenLDAP到底有什么差异呢?解答:简单一句话就是:旧版本的OpenLDAP配置文件一般是slapd.conf(路径可能是/etc/openldap,也可能是/usr/local/openldap,甚至可能是/usr/share/slapd/,不同版本不同安装不同系统都可能不同,可使用locateslapd.conf进行查找正确的路径),而新版本(我测试的新版本是2.4.31)的OpenLDAP服务运行时并不会读取该配置文件,而是从slapd.d目录(一般与slapd.conf在同一目录下)中读取相关信息,我们需要把该目录下的数据删掉,然后利用我们在slapd.conf里配置的信息重新生成配置数据。这也可能是你启动服务后运行ldap相关命令却出现“ldap_bind:Invalidcredentials(49)"错误的主要原因。具体怎么重新生成配置数据请看参考资料。疑惑5:自定义的ldif数据文件中的objectclass后的domain、top、organizationalUnit、inetOrgPerson等等都是什么意思,可以随便写吗?解答:存储LDAP配置信息及目录内容的标准文本文件格式是LDIF(LDAPInterchangeFormat),使用文本文件来格式来存储这些信息是为了方便读取和修改,这也是其它大多数服务配置文件所采取的格式。LDIF文件常用来向目录导入或更改记录信息,这些信息需要按照LDAP中schema的格式进行组织,并会接受schema的检查,如果不符合其要求的格式将会出现报错信息。因此,ldif文件中的属性都定义在各大schema中,其中objectclass是对象的类属性,不能随便填写,而应与schema中一致。一般slapd.conf文件的头部都包含了这些schema:include ../etc/openldap/schema/core.schemainclude ../etc/openldap/schema/cosine.schemainclude ../etc/openldap/schema/inetorgperson.schemainclude ../etc/openldap/schema/nis.schemainclude ../etc/openldap/schema/krb5-kdc.schemainclude ../etc/openldap/schema/RADIUS-LDAPv3.schemainclude ../etc/openldap/schema/samba.schema其中前三个是比较重要的schema,定义了我们所需要的各个类,比如ldif中一般先定义一个根节点,其相应的objectclass一般是domain和top,而根节点下的ou属性即定义组节点(group)的objectclass一般是organizationalUnit,group下可以是group也可以是用户节点,用户节点的objectclass一般是inetOrgPerson。而各个节点的一系列属性如用户节点的uid、mail、userPassword、sn等等都定义在schema中相关的objectclass里,可以自己查找看看。疑惑6:OpenLDAP认证用户uid时默认是不区分大小写的,也就是“alexia”与“AleXia”是同一个用户,在有些情况下这并不合理,能配置使得认证时能区分大小写吗?解答:以我目前的经验来看,旧版本的OpenLDAP是可以配置区分大小写的,而新版本的OpenLDAP却配置不了。为什么这么说呢?这里就涉及到“matchingrules〃这个概念了,即匹配规则,就是各个属性按什么样的规则进行匹配,比如是否区分大小写、是否进行数字匹配等等,这里有详细的官方匹配规则描述。比如旧版本的core.schema里有下面这样一段:attributetype(0.9.2342.1920030NAME('uid''userid')DESC'RFC1274:useridentifier'EQUALITYcaseIgnoreMatchSUBSTRcaseIgnoreSubstringsMatchSYNTAX.5{256})从字面上也可以看出,其中caseIgnoreMatch和caseIgnoreSubstringsMatch就定乂了uid或userid属性匹配时不区分大小写,如果我们将其改为caseExactMatch和caseExactSubstringsMatch就表示用户uid认证时需要区分大小写,也就是“alexia〃与、'AleXia〃同不同的用户,这很简单,在旧版本的OpenLDAP也行得通。可是在新版本的OpenLDAP中却不行,新版本的core.schema文件中也包含这样一段:#attributetype(2.16.840.1.113717NAME('uid''userid')DESC'RFC1274:useridentifier'EQUALITYcaseIgnoreMatchSUBSTRcaseIgnoreSubstringsMatchSYNTAX.5{256})可惜是注释掉的,那我们取消注释然后改属性行不行呢?答案是不行,会报错:DuplicateattributeType:"2.16.840.1.113717〃,也就是说该属性已经被定义了,然后我就去包含的所有schema中搜索uid属性的定义,结果却找不到定义,那么为什么还会报这个错误呢?后来一阵搜索,终于在这个帖子“slapd:built-inschemaforuidNumber/gidNumberdoesnothaveorderingdirective7知道了答案,原来新版本的OpenLDAP已经把uid属性定义schema硬编码到了slapd程序中,也就是无法在配置文件中修改了,真是坑!针对这个问题,我给出两个不太好的解决方案:下载OpenLDAP源码,找到定义uid属性匹配规则的地方,修改它然后重新编译。这个工作量不轻松,热爱研究源码的人可以尝试。不要用uid属性进行认证,我们可以自定义一个与用户 对应的属性如user-id(不要与已有的属性重复就行),其配置与uid一模一样(即模仿uid),然后用该属性作为认证的因子,建议重新建一个schema,然后配置好后include进slapd.conf中重启服务即可。具体怎么定义和配置可以参考这篇文章。我的主要经验也就这些。OpenLDAP也有客户端,如果你配置成功后,可以用客户端或写Java程序进行验证。OpenLDAP客户端OpenLDAP既有图形客户端也有网页客户端。图形客户端主要有两个图形客户端:LdapBrowser282(下载:LdapBrowser282.zip,下载解压后直接双击:lbe.bat文件即可运行)和LdapAdmin(官方下载),使用都非常简单。如下是两个客户端的界面,都需要先建立一个链接,填上相应的IP地址、端口和dn配置,然后连接即可获得你配置的数据。LDAPBrowser客户端:LDAPAdmin客户端:网页客户端即phpLDAPadmin,基于PHP的一个web应用,需要配置Apache服务器和PHP,具体的配置方法可参考“phpLDAPadmin安装配置讲解,通过Web端来管理您的LDAP服务器〃,我比较偷懒,直接使用的PHPnow全套服务,安装成功后大概是下面这样一个界面:

Entriesfound;1(Q.Ol神)Ejde-example,de-comEntriesfound;1(Q.Ol神)Ejde-example,de-com(+)击ou^custornersou-equipment(1)outgroups⑶ou-people(3)cn^JohnSmith(1)cn^RobsrtSmtth(1)cn=5heriSmiih(1)iW条目创建所禁国schemasearch刷新信总异A.export更冶LoggedInm*Cfi*-jir*ibob服务器〔倒单挫索煎格]^定义的核索)MyLDAPServer基本DNou=pcoplefldc=CKan:;pleJdc=cojiUAf浏宽魏索苑围Sub(签吁于捌) v会索过诚器CTU=Jolm+显不居匡河si^aid,homePhohe,ea口Orderby「 •—ncn=JohrSmith使用Java完成LDAP身份验证下面借鉴网上资料提供一个简单的认证程序如下:importjava.util.Hashtable;importjavax.naming.AuthenticationException;importjavax.naming.Context;importjavax.naming.NamingEnumeration;importjavax.naming.NamingException;importjavax.naming.directory.SearchControls;importjavax.naming.directory.SearchResult;importjavax.naming.ldap.Control;importjavax.naming.ldap.InitialLdapContext;importjavax.naming.ldap.LdapContext;publicclassLDAPAuthentication{privatefinalStringURL=〃ldap://:389/〃;privatefinalStringBASEDN=〃ou=Tester,dc=alexia,dc=cn〃;//根据自己情况进行修改privatefinalStringFACTORY="com.sun.jndi.ldap.LdapCtxFactory”;privateLdapContextctx=null;privatefinalControl]]connCtls=null;privatevoidLDAP_connect(){Hashtable<String,String>env=newHashtable<String,String>();env.put(Context.INITIAL_CONTEXT_FACTORY,FACTORY);env.put(Context.PROVIDER_URL,URL+BASEDN);env.put(Context.SECURITY_AUTHENTICATION,"simple");Stringroot="cn=manager,dc=alexia,dc=cn”;//根,根据自己情况修改env.put(Context.SECURITY_PRINCIPAL,root);//管理员env.put(Context.SECURITY_CREDENTIALS,"123456");//管理员密码try{ctx=newInitialLdapContext(env,connCtls);System.out.println("认证成功”);}catch(javax.naming.AuthenticationExceptione){System.out.println("认证失败:");e.printStackTrace();}catch(Exceptione){System.out.println("认证出错:");e.printStackTrace();}if(ctx!=null){try{ctx.close();}catch(NamingExceptione){e.printStackTrace();}}}privateStringgetUserDN(Stringuid){StringuserDN="”;LDAP_connect();try{SearchControlsconstraints=newSearchControls();constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);NamingEnumeration<SearchResult>en=ctx.search(〃〃,"uid="+uid,constraints);if(en==null||!en.hasMoreElements()){System.out.println("未找到该用户");}//maybemorethanoneelementwhile(en!=null&&en.hasMoreElements()){Objectobj=en.nextElement();if(objinstanceofSearchResult){SearchResultsi=(SearchResult)obj;userDN+=si.getName();userDN+=","+BASEDN;}else{System.out.println(obj);}}}catch(Exceptione){System.out.println("查找用户时产生异常。");e.printStackTrace();}returnuserDN;}publicbooleanauthenricate(StringUID,Stringpassword){booleanvalide=false;StringuserDN=getUserDN(UID);try{ctx.add

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论