我们知道LDAP是一种协议标准,目前有很多厂商实现了这个标准,并有了自己的产品。
比如,下面的产品都是实现LDAP协议的具体厂商的产品。
- IBM Tivoli Directory Server 6.1, 6.2
- Microsoft Active Directory 2003, 2008
- Microsoft Active Directory Application Mode Retail version
- Novell eDirectory Server 8.8, 8.8.5
- Sun Java System Directory Server Enterprise Edition 6.0, 6.3.3, 7.0
- Red Hat Directory Server 8.0
- Oracle Internet Directory 10.1.2.0.2, 10.1.4.0.1, 11.1.1.2.0
-OpenLDAP
那么,当一个用户在LDAP服务器上添加,删除或者修改了一条记录(Entry)之后,
我们如何知道,其修改了哪些应用记录呢?换句话说。LDAP服务器是如何记录器修改的
历史的呢?
笔者总结起来,总共有两种方式,
方式一 把记录信息写到日志文件里面,比如,
(1)ADS\ADM
其利用了ADS\ADM的USN,Update sequence number,其记录了Entry的修改的记录,比如当前的新建了7个Entry,那么USN=7,如果你又新建了一个Entry,则这个USN变成了8。此后,你又删除了其中一个entry,则此时的USN=9,但是实际的entry数量为7,如果你又修改了其中一个entry,则USN又变成了10.这样通过比较两次查询到USN的值就可以知道,
在两次查询中间,服务器上记录发生了什么变化。
(2)OID(Oracle Internet Directory Server)
通过查询OID LDAP服务器上的changeLog来实现追踪LDAP服务器上数据的变化的,每一次对LDAP的服务器上的变化,都对在changeLog里面生成一个logNumber,然后这个LogNumber记录的是修改的次数,这样通过对LogNumber的追踪可以发现LDAP服务上的变化,此Log里面包含了变化的Entry的DN,opcode以及objectclass等信息,但是唯一遗憾的是删除操作的时候,其changeLog里面不会包含objectClass的信息.
(3) OpenLDAP
除了是通过AccessLog来实现追踪服务器上数据的变化之外,其他的和OID的方式以及缺陷是一样的。
最大的优点是,即使网络出现了问题,客户端在下次登录到服务之后,还是能知道这段时间内,LDAP服务上的变化,
因为这些变化都白纸黑字的在LDAP服务器上存着呢。
方式二 Peristant Search原理来实现
Peristant Search的基本原理如下,当客户端与LDAP服务器端建立连接后,服务器端会和客户端建立一个消息通道,然后在客户端建立一个Message Queue,把服务器上变动的信息发送到客户端本地。从而不管服务器与客户端的连接是否仍然有效,这个的话,一旦比如因为网络问题,连接断掉了,而此时服务器却不知道,还是往客户端的Message Queue队列里面发送消息,此时会报错,从而在网络出现问题的这段时间内,LDAP服务上发生的变化,客户端就没有办法知道了。Sun Java System Directory Server Enterprise Edition,Novell eDirectory Server,IBM Tivoli Directory Server以及Redhat的Directory Server都是通过Peristant Search原理来实现。