综合整理来自
https://blog.csdn.net/heyitian/article/details/53508663
和
https://blog.csdn.net/jiujiuming/article/details/70057904
第二篇文章给了我启发,将第一篇的mydemo.ldif文件内容的格式,换行是不能瞎换的,从第二个dn开始每个dn前换行(有一个空行),文档结束还要有一个换行,其余不能有换行,因为ldap这里的语言是靠换行来区分元素的。
第一篇博客:
这篇文章是众多网上资料中写得很详细,所以特此转载,非常感谢原作者,附上原链接:
目录
- 概述
- 测试环境
- 安装过程
- 配置启动
- 客户端介绍
- 多级DC的ldif文件的配置
[一]、概述
什么叫LDAP呢,概念的东西这里就不多讲了,网上搜索下有很多,本文的重点是介绍如何在windows平台上安装和配置openLDAP软件。
openLDAP官方网站:
http://www.openldap.org/
openLDAP官网只提供了linux平台的相关安装文件,windows平台的安装包可以到以下一些网站下载:
- http://www.userbooster.de/download/openldap-for-windows.aspx(本文所用的版本)
- http://sourceforge.net/projects/openldapwindows/files/
- http://sourceforge.jp/projects/openldapwin32/releases/
[二]、测试环境
- window7 – 64位
-
openLDAP 版本:2.4.30 (
http://www.userbooster.de/download/openldap-for-windows.aspx
)
[三]、安装过程
按照提示 一直 next ,直到安装完成:
安装完成后,在系统服务中,找到 OpenLDAP Service,先停止服务,再把启动类型修改成手动,便于自己的测试。
[四]、配置启动
安装目录:D:\Program Files (x86)\OpenLDAP
编辑文件:D:\Program Files (x86)\OpenLDAP\slapd.conf 找到如下内容:
1 2 |
suffix “dc=maxcrc,dc=com” rootdn “cn=Manager,dc=maxcrc,dc=com” |
修改成:
1 2 |
suffix”dc=micmiu,dc=com” rootdn”cn=Manager,dc=micmiu,dc=com” |
打开控制台,切换到openLDAP安装目录下,启动openLDAP,命令如下:
1 |
slapd -d 1 |
会在控制台看到类似如下的日志信息:
日志信息:slapd starting 表示服务已经启动好了。
新建一个文件:D:\Program Files (x86)\OpenLDAP\mydemo.ldif ,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
dn:dc=micmiu,dc=com objectclass:domain objectclass:top o:MichaelBlog dc:micmiu dn:ou=Developer,dc=micmiu,dc=com objectclass:organizationalUnit ou:Developer description:Containerfordeveloperentries dn:ou=Tester,dc=micmiu,dc=com objectclass:organizationalUnit ou:Tester description:Containerfortestentries dn:uid=Michael,ou=Developer,dc=micmiu,dc=com uid:Michael objectClass:inetOrgPerson mail:sjsky_007@gmail.com userPassword:111111 labeledURI:http://www.micmiu.com sn:Sun cn:MichaelSun dn:uid=Miumiu,ou=Tester,dc=micmiu,dc=com uid:Miumiu objectClass:inetOrgPerson userPassword:111111 labeledURI:http://www.micmiu.com sn:Wu cn:MiumiuWu |
tips:格式要严格,每行的开头和末尾不能有空格
然后在控制台中切换到openLDAP安装目录下执行ldapadd命令:
1 |
ldapadd -x -D “cn=Manager,dc=micmiu,dc=com” -w secret -f ./mydemo.ldif |
参数说明:
- -x 使用简单验证方式
- -D 指定管理员DN(与slapd.conf中配置的一致)
- -W 大写W表示回车后根据提示输入密码,可以使用小写的-w password 直接输入密码
- -f 需要导入数据LDIF的文件名
- -h 目录服务器的IP地址
添加成功会显示如下信息:
!!!有网友说:按照我上面的命令,提示:’ldapadd’ 不是内部或外部命令,也不是可运行的程序或批处理文件。经过我的验证发现,该windows版本的openLDAP确实没有这个命令,我能执行成功是因为本机安装过oracle,而Oracle自带安装了LDAP client的一些常用命令。
如果没有”ldapadd“这个命令,还可以用它自带的命令“slapadd”代替导入数据文件。不过要注意的是:和ldapadd命令不同的是:执行slapadd命令前需要先停止之前启动的 slapd 服务(打开服务确定停止了该服务),然后在控制台中切换到openLDAP安装目录下执行命令:
1 |
slapadd-v-l./mydemo.ldif |
运行结果如下:
ldapadd 和 slapadd 的差异:
- ldapadd 对本地和远程服务都可以操作,操作时LDAP服务是不能停止
- slapadd 只能对本地的LDAP服务进行操作,操作时本地LDAP服务必须先停止
验证添加的信息,在控制台中,切换到%OpenLDAP_HOME%/ClientTools 输入查询命令:
1 |
ldapsearch -x -b “dc=micmiu,dc=com” “(objectclass=*)” |
查询结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
D:\ProgramFiles(x86)\OpenLDAP\ClientTools>ldapsearch-x-b”dc=micmiu,dc=com””(objectclas
s=*)”
dc=micmiu,dc=com
objectClass=domain
objectClass=top
o=MichaelBlog
dc=micmiu
ou=Developer,dc=micmiu,dc=com
objectClass=organizationalUnit
ou=Developer
description=Containerfordeveloperentries
ou=Tester,dc=micmiu,dc=com
objectClass=organizationalUnit
ou=Tester
description=Containerfortestentries
uid=Michael,ou=Developer,dc=micmiu,dc=com
uid=Michael
objectClass=inetOrgPerson
mail=sjsky_007@gmail.com
userPassword=111111
labeledURI=http://www.micmiu.com
sn=Sun
cn=MichaelSun
uid=Miumiu,ou=Tester,dc=micmiu,dc=com
uid=Miumiu
objectClass=inetOrgPerson
userPassword=111111
labeledURI=http://www.micmiu.com
sn=Wu
cn=MiumiuWu
验证成功。
[五]、客户端介绍
网上搜索到一个客户端:LdapBrowser282 附件提供相关下载:
LdapBrowser282.zip
下载解压后直接双击:lbe.bat 文件即可运行。
点击上图中的 Fetch DNs 按钮会自动获取相关的DN信息的。上面的输入的密码就是之前安装过程中的那个密码(如果自己没有修改过)
可以正确查询到之前添加的相关信息。
[六]、多级DC的ldif文件的配置
在实际应用中我们经常会碰到二级域名,类似:app1.micmiu.com、app2.micmiu.com,那么对应到LDAP中的DC就是多级,这时我们ldif文件又是如何配置呢?下面将给出个示例演示,新建一个文件:D:\Program Files (x86)\OpenLDAP\myappuser.ldif ,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
dn: dc=app1,dc=micmiu,dc=com
objectclass: domain
o: Michael Demo
dc: app1
dn: dc=app2,dc=micmiu,dc=com
objectclass: domain
o: Michael Demo
dc: app2
dn: ou=Demo,dc=app1,dc=micmiu,dc=com
objectclass: organizationalUnit
ou: Developer
description: Container for Demo entries
dn: ou=Demo,dc=app2,dc=micmiu,dc=com
objectclass: organizationalUnit
ou: Developer
description: Container for Demo entries
dn: uid=michael,ou=Demo,dc=app1,dc=micmiu,dc=com
uid: admin
objectClass: inetOrgPerson
mail: sjsky_007@gmail.com
userPassword: 111111
labeledURI: http://www.micmiu.com
sn: Sun
cn: Michael Sun
dn: uid=hazel,ou=Demo,dc=app1,dc=micmiu,dc=com
uid: user
objectClass: inetOrgPerson
userPassword: 111111
labeledURI: http://www.micmiu.com
sn: Wu
cn: Hazel Wu
dn: uid=michael,ou=Demo,dc=app2,dc=micmiu,dc=com
uid: admin
objectClass: inetOrgPerson
mail: sjsky_007@gmail.com
userPassword: 111111
labeledURI: http://www.micmiu.com
sn: Sun
cn: Michael Sun
dn: uid=hazel,ou=Demo,dc=app2,dc=micmiu,dc=com
uid: user
objectClass: inetOrgPerson
userPassword: 111111
labeledURI: http://www.micmiu.com
sn: Wu
cn: Hazel Wu
tips:注意dc的对应关系,如下图:
然后在控制台窗口中执行ldapadd命令:
1
ldapadd-x-D”cn=Manager,dc=micmiu,dc=com”-wsecret-f./myappuser.ldif
添加成功会显示如下信息:
如果 ldapadd 命令无法运行,先停止slapd 服务,然后在控制台中切换到openLDAP安装目录下执行命令:
1
slapadd-v-l./myappuser.ldif
客户端工具中可以查询到相关信息:
ok,本文到此已经基本介绍完了,以后再详细介绍如何用Java实现对LDAP的相关操作
注意:
用LDAPadmin工具登陆以后,需要对用户进行设置密码,访问时需要用到。
第二篇博客:
前言
目的之初始于学Security的SSO的时候想要自己搭建一个LDAP服务,原本以为一两天就能搞定的东西,我还是低估了LDAP这片大领域,到目前为止走了不少弯路,百度谷歌了不少资源,其中大多数是Linux下的搭建,而且无一例外,大部分都是拷贝粘贴的成品,虽然我这篇也基本集精华于百度谷歌,不过也想和大家分享分享我的学习成果,主要讲讲我走过的一些弯路。
安装OpenLDAP
首先OpenLDAP我下载的是:2.4.42版本。
安装过程比较简单一直next就可以了,不过别无脑next,密码之类的数据库之类的至少要自己修改一下。数据库我选择的是BDB(Berkeley DB,在这个东东花不少时间),它有如下几个特点:
– 高并发
– 内存小
– 查询快(NoSQL,针对查询进行优化的数据库)
– 嵌入式
– 云存储(key-value对存储)
– 单机小霸王(没错!它似乎不支持远程!)
嗯对!没错!它是嵌入式数据库,也就是说它是嵌入了OpenLDAP这个软件的,我们没必要去搭这个数据库,然后我确确实实在证实这一点上花了不少时间,以至于我的电脑现在就有BDB这个数据库,而且对它还小有了解。。。
安装完之后默认是开启服务的,你应该在服务中停止它,并设定为手动开启,这主要是方便我们后面调试。
配置OpenLDAP
安装完之后我们进入OpenLDAP的安装目录,在该目录下我们需要关注几个文件:
– slapd.conf
– maxcrc.ldif
配置文件是slapd.conf,这个文件主要配置如下:
1.database bdb #配置数据库,我们下载的时候选择的是BDB
2.suffix “dc=maxcrc,dc=com” #配置后缀,也就是你的树根,我们可以类比关系型数据库的数据库名
3.rootdn “cn=Manager,dc=maxcrc,dc=com” #登陆的用户名
4.rootpw {MD5}9huttJT7BbQS1yE4HL/vqw== #配置密码,看这样子是base64加密
上面的配置中第一个应该是不能改的,因为在安装过程中让我们选择数据库就意味着它只下载你选定的数据库(大概)。
第二项根据的你喜好设定,可以不用dc,之所以用dc是取名domain name,在这之前,往往是取c(country),不过现在很多公司用域名来代表自己而不用地域和公司名,因此基本都用dc。
第三项同样根据你的喜好设定,不过一般不会改动,大概是一种大家心照不宣的规则——OpenLDAP管理员用cn=Manager,而其他的比如AD、ADS(都是LDAP协议的实现)则用其他的。
第四项配置登陆密码,你可以设定成明文,也可以在命令行通过slappasswd的命令来加密,然后加密后的密码粘贴过来,登陆的时候同样通过明文登陆,它自己会解密匹配的。
最后,建议假如你刚开始接触这方面的内容,最好不要过多改动它的配置文件,不过如果你经得起折磨,一定要按自己心思来改动它的配置文件,因为你会获得很多知识,走弯路能获得意想不到的成果。
现在假如配置完了,你可以尝试启动它。在安装目录通过slapd -d 1启动它。如果你能看到58eca2bc slapd starting说明你的配置是没问题的,那么开始下一步,导入数据。
导入LDIF数据
在导入数据这块我花了不少时间,花了大量时间去学习LDIF的语法以及一些相关的知识。如果你遇到了一些问题,比如无法导入,导入失败的话,我能猜测你的LDIF文件多半是拷贝网上的,并且不加思考地拿来用,而这应该是很多初学者导致问题的原因,因此你在导入之前必须熟悉LDIF。
LDAD是什么?LDIF 完全独立于在所有特定目录中使用的储存格式,LDIF 通常用于从 LDAP 服务器导出目录信息或将数据导入 LDAP 服务器。他一般是如下格式:
dn:dc=maxcrc,dc=com
objcetclass:top//下面的换行必须有
dn:ou=People,dc=maxcrc,dc=com
objectclass:top
objectclass:organizationalUnit
ou:People//下面的换行必须有
dn: cn=hua,ou=People,dc=maxcrc,dc=com
objectclass: inetOrgPerson
cn:hau
sn:huamei
userPassword:hauhua
telephoneNumber:244245963255//下面的换行必须有
---------------------
作者:ice_bearbear
来源:CSDN
原文:https://blog.csdn.net/jiujiuming/article/details/70057904?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
我们知道,LDAP是通过树型结构组织数据的(如果你不知道我觉得你最好先熟悉一下LDAP的概念在尝试搭建LDAP服务),并且也正是得益于它这种组织的方式,因此它读取数据相当快,相对的新增数据就显得比较慢。而这种组织方式就在LDIF文件中体现出来了。
首先先熟悉“LDAP数据库”的相关概念。LDAP-》条目-》属性:值,这就是“LDAP数据库”的相关概念的最完整的描述((⊙﹏⊙)b)。上面LDIF文件总共有三个条目,每个条目之间通过换行符分隔(记住,最后一个条目后面也有一个换行符,不然文件出错),条目的概念我们可以类比关系型数据库的记录;每个条目通过dn(distinguished name)进行区分,dn是唯一的,相当于关系型数据库的主键(但是不要完全用关系型数据库的概念来取而代之,它们毕竟是两种东西);dn的objectclass是对象类型,这是大部分我们CtrlC&CtrlV出错的根源,objectclass有三种类型:结构类型(Structural)、抽象类型(Abstract)和辅助类型(Auxiliary)。结构类型是最基本的类型,它规定了对象实体的基本属性,每个条目属于且仅属于一个结构型对象类。抽象类型可以是结构类型或其他抽象类型父类,它将对象属性中共性的部分组织在一起,称为其他类的模板,条目不能直接集成抽象型对象类。辅助类型规定了对象实体的扩展属性。每个条目至少有一个结构性对象类。对于这些类型的定义被写进schema文件里,它们被存放在安装目录下的schema目录内,这些schema通过slap.conf导入,像下面这样导入:
include ./schema/core.schema
include ./schema/cosine.schema
include ./schema/nis.schema
include ./schema/inetorgperson.schema
1
2
3
4
我们在看一些教程的时候它们会反复强调这些文件的导入是有次序要求的,但又没说明为什么,可能它们觉得很简单不需要告知,然而我在这些导入次序上也花了不少时间。实际上,这种次序要求主要原因是类的继承上,在导入某个schema文件时,有时候它的类需要依赖其他的类,而这些其他类的导入次序在这个类的之后的话它就报错。所以当我们想要知道它的次序要求的时候简单的浏览一下它内部定义的类是不是存在依赖关系,一般的,core.schema定义了最基本的类,它永远排在第一位。objectclass的定义大致如下(下面我抽取了inetOrgPerson的继承关系):
# inetOrgPerson
# in inetorgperson.schema
objectclass ( 2.16.840.1.113730.3.2.2
NAME ‘inetOrgPerson’
DESC ‘RFC2798: Internet Organizational Person’
SUP organizationalPerson
STRUCTURAL
MAY (
audio $ businessCategory $ carLicense $ departmentNumber $
displayName $ employeeNumber $ employeeType $ givenName $
homePhone $ homePostalAddress $ initials $ jpegPhoto $
labeledURI $ mail $ manager $ mobile $ o $ pager $
photo $ roomNumber $ secretary $ uid $ userCertificate $
x500uniqueIdentifier $ preferredLanguage $
userSMIMECertificate $ userPKCS12 )
)
#in core.schema
objectclass ( 2.5.6.7 NAME ‘organizationalPerson’
DESC ‘RFC2256: an organizational person’
SUP person STRUCTURAL
MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $
preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $
telephoneNumber $ internationaliSDNNumber $
facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $
postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l ) )
#in core.schema
objectclass ( 2.5.6.6 NAME ‘person’
DESC ‘RFC2256: a person’
SUP top STRUCTURAL
MUST ( sn $ cn )
MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
通过这样我们既可以看出他们的继承关系,假如我们把core.schema放在inetOrgPerson.schema后面可能就会出大问题了。在这个objectclass的定义中,我们看到person这个类的定义。首先是2.5.6.6这个类似点分四组序列的东东,说实话我不是很懂这是什么东西,大概是类似标志位的东西,听说通过什么什么组织,获得一个这种什么什么码是要钱的,而且超贵,不过这个不是我们关心的事情,我们(至少我是这样)把它简单理解成标志位就好了;Name命名该类,我们给对象赋值objectclass就是通过这个name来赋值的;DESC就是描述;MUST是该类必须含有的属性,也就是如果你定义的你的对象为该类的对象,那么它就必须包含这两个属性,其中sn(surname)是姓氏,cn(common name)是常用名称,一般就是名字吧。最后的MAY是可选参数,也就是说你定义的对象是不能随便指定参数的,你的参数必须是这个类的可选参数。另外,如果你要给这个类添加参数也不是直接在这里添加一个字段就可以的,你还必须在该schema文件内声明这个参数的属性。例如:
attributetype ( 2.5.4.4 NAME ( ‘sn’ ‘surname’ )
DESC ‘RFC2256: last (family) name(s) for which the entity is known by’
SUP name )
1
2
3
最后是属性:值,属性相当于关系型数据库中的字段(field),它就像上面那样被定义在schema文件内,值可以是任何类型的值,实际上在属性的定义上也没规定数据类型这种东西,而且说到底ldap的数据类型也跟关系型数据的数据类型完全不一样,所以不能停留在关系型数据库的思维里面。还有一点是,属性可以不是唯一的,比如我们可以定义两个不同的userPassword在一个条目里面,这是不冲突的。其实除此之外,LDIF还有一个标志是changetype,它是对“目录数据库”进行增删改操作的,不过我用服务端命令的时候出错了,它不认这个属性,不过我也没去深究,因为后面我都会用JNDI操作数据库,而不会用它的这些工具。一般按照规则编辑好LDIF文件之后,直接通过slapadd -l filename.ldif就能进行导入了,检索或者其他操作可以通过clientTools内的工具进行操作,具体自己help看看就知道命令怎么用了。最后推荐两个工具。
– ldapBrowser
– Apache Directory Studio
上面那个是用于连接ldap并进行查询的工具。下面那个用途比较广,具体看它的官方文档,讲得也是比较清楚,下面那个也有eclipse的插件版本,直接可以在eclipse的插件库下载。
另外,强推这个 家伙的博文,写得很好!
———————
作者:ice_bearbear
来源:CSDN
原文:https://blog.csdn.net/jiujiuming/article/details/70057904?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!