LDAP是一种目录访问协议,它规定了以树状结构的方式来存储和访问数据。然而协议是抽象的,要产生具体的功效,必须在应用中实现,比如AD域服务就实现了LDAP协议。
LDAP最明显的优势就是读取速度快,拥有极高的搜索效率。
可以用一个例子来体会这种速度:当我们进入一个迷宫,需要寻找出口。
- 普通数据库:一条路一条路地尝试,直到尝试出能走出去的路线,再将这条路线返回给我们。
- LDAP:相当于拿了一张解密地图,上面清清楚楚写着哪条路能直接到达出口。
很明显,普通数据库也许要尝试十多次才能找到正确的路线,但是LDAP只要一次就能找到,搜索性能上孰优孰劣一目了然。
除此之外,LDAP允许灵活地添加数据,并且采取【客户端-服务端】的方式提供服务,即在服务端存储数据,在客户端操作数据,但相比于关系型数据库,它不支持事务、回滚等操作。
LDAP之所以拥有这些特点,主要基于它的数据存储方式——树形目录,即在系统中构建一棵树,在树叶上存储数据。接下来我们通过在系统中搭建一棵树的流程,详细介绍LDAP原理。
一、LDAP原理
构建一棵树,首先我们需要确定这棵树长在哪里,也就是树根是什么。
LDAP中将域名拆分开,形成树根,系统中的树根叫做DC,比如在test20.local域下,树根为DC=test20,DC=local。
相比于直接用test20.local做树根,这样的组织方式让整体结构更清晰,同时便于扩充域。假如有另一个叫test20.local2的域要加入这棵树,那么我们就可以直接将DC=local2放到DC=test20下面,而不必重新构建一棵叫test20.local2的树,如下图所示。
树根有了,下一步,我们开始构建树枝。
LDAP中,树的枝干通常是由组织单位(OU)来充当,主要是区分数据所属范围。比如有一个叫张三的用户在local下的信息部,那么张三所属枝干就是OU=信息部。
在这里,LDAP有一个明显优势,就是每一个树枝都可以被单独放在一个服务器中进行管理。这不仅有利于减轻服务器负担,也方便具有分公司的企业在不同地域部署服务器。
到最后,只要把所有的数据制作成树叶,挂到树枝上去就行了。
制作树叶有两个关键的地方,一个是树叶名字,另一个是树叶内容。
LDAP规定的名字结构由两部分组成,一部分是直接名称,即CN,一部分是相对名称,即RDN。
CN是唯一的,用来区分不同树叶。比如用户张三注册时,CN=张三。
而RDN是指从树根到树叶经过的所有枝干,用来标识树叶位置。如果Sam用户在市场运营部,他的RDN就是DC=test20,DC=local,OU=信息部。
RDN加CN就形成了数据名称,用DN来表示,张三的DN就是:DC=test20,DC=local,OU=信息部,CN=张三。
正是这样的名字结构提升了LDAP的读取效率,因为DN就是那张标识了出口路线的地图,只要我们顺着名称往下寻找,就能直接找到所需数据。
树叶内容主要是描述这片树叶的颜色、形状、气味等独特的信息,对应到系统中,就是资源的属性,比如用户的属性有性别,身份证号,电话等,计算机的属性有操作系统类型、账号密码等。
一片树叶名称加上它的属性就形成完整的数据信息,在系统中被称为条目。
每片树叶有它单独的条目,如果要增加新的信息,只需要在条目中添加一个属性,不会影响其它的条目。而在关系型数据库中,增加信息需要改变表结构,相比来说,困难很多。
为了提高效率,LDAP还提供了一种比较方便的做法,就是给具有相同属性类型的资源制定模板,在注册时直接往模板中填充信息就能创建一片树叶,这就是对象类。
比如说系统中有一个对象类叫用户,它的属性包括姓名、电话、邮箱。那么我创建用户时,必须填写这三项才能创建成功。
系统中的树还有一个不一样的地方,就是各种不同品种的树叶可以长在一棵树上,这个不同品种的树叶是由系统中多种多样的资源对象来充当的,所以我们可以想象一棵长满了用户、计算机和打印机的树。
除此之外,它还可以允许杂交树叶的存在。这是因为系统中的某个资源对象可能同时具有多个对象类的属性,比如系统管理员,它就同时具有用户和管理员的属性。
到此,在LDAP协议的“指导”下,我们就成功在系统中构建好一棵完整的树了。
二、结语
LDAP常用来构建统一的账号管理、身份验证平台,实现sso单点登录机制。此外,它还有访问控制和数据复制的功能,能够帮助增强系统安全性和容灾性。
但同时,LDAP协议也存在一些安全问题,比如LDAP注入造成的恶意LDAP查询。在工作生产中,同样需要我们多加防范。