现在很多企业中都会用到LDAP,一个常见的例子,假如一个大型企业,有很多linux服务器,企业员工可以登录到这些linux服务器中做开发以及测试,但员工是否需要每台linux服务器都需要一个帐号,还是所有linux服务器公用一个帐号呢? 还有一种情况,假如企业内容有很多用户管理系统,比如绩效系统,请假系统,办公系统等等,那么员工在使用这些系统时是否可以共用一个统一的帐号呢? 这两种情况的答案是肯定的,就是使用一个帐号能够将所有这些都搞定!
专业一点说,这两种情况都叫做"统一用户认证"。 如何来实现它呢,目前比较流行的就是使用ldap.
说到Ldap,有几个容易混淆的概念:
- ldap协议,跟http/ftp一样,属于应用层协议,基于tcp/ip的,通过这个协议就能很方便地跟ldap服务器通信。
- ldap服务器,ldap服务器可以是一台专门的机器,从本质上讲,它必须包含两个东西:一个是处理ldap协议的程序,大概要解析ldap协议,提取ldap消息内容(是查询/修改还是其他...)。 另一个就是集中的资源,比如员工的账户信息。
- ldap客户端,就是需要统一认证的地方,比如用户管理登录时的逻辑。
这里不打算探讨ldap协议,因为目前有现成的api已经封装了这些协议,对用户是透明的。对于ldap服务器,只是浅谈下资源是如何存放的? 很多人都说ldap是数据库,其实也可以这么理解,因为ldap有一个存放资源的地方,跟数据库类似。但资源存放的方式却与数据库不同(这里的数据库指的是关系型数据库)。 了解数据库的人都知道,rdbms是以表为单位,表跟表之间是相互关联的。而ldap中的资源却是层次型的,是以树的方式进行存储的,这样做的目的是为了便于查询。这是ldap与数据库最大的不同。
e.g. 单位名称
部门A 部门B ....
账户A1 账户A2... 账户B1 ....
有了树这种结构,对资源的查找就会非常方便。
在实际的使用中,如何来配置这些资源呢? 可以通过一些GUI来实现,比如ldap browser/open ldap等工具进行配置,可以把它们想象成db2 control center 或者 oracle Sql*Plus,通过这些工具,可以配置这棵树,查询/修改这棵树等
对于编程开发人员来说,如何来对ldap中的资源进行操作呢? 这里主要介绍一下java中JNDI.
JNDI:java命名和目录接口,包含两个方面,命名接口和目录接口。
命名接口:与DNS类似,给定一个名字,返回一个值。
目录接口:如何理解目录呢? 其实就是一颗树,可以参照linux文件系统,每个文件可以是目录或者就是文件本身,树的节点可以是叶子节点也可能是根节点。也就是说,给定一个名字,返回的值是一颗树。可以认为目录接口包含命名接口(当这棵树只有根节点时)。
JNDI API是J2SE中的标准API,是通用的API。JNDI中包括5个包:javax.naming,javax.naming.directory,javax.naming.event,javax.naming.ldap,javax.naming.spi。
常用的JNDI操作有:bind,unbind,lookup,rename,NamingEnumeration listBindings,NamingEnumeration list。
使用JNDI来访问命名服务或目录服务,操作步骤如下:
1、建立一个HashTable,包含定义所希望使用的JNDI服务的属性,所希望连接的LDAPIP地址以及端口;
2、将与认证成用户登录有关的任何信息添加到散列表中;
3、创建初始context对象。如果访问命名服务,则使用InitialContext类,如果访问目录服务,则要使用InitialDirContext类;
4、使用刚才得到的context对象执行所需的操作,如添加新的条目或者搜索条目;
5、完成操作后关闭context对象。
更多的细节,请见我转载的两篇文章:LDAP目录服务以及JNDI 理解学习
理解与应用ldap服务器
欢迎批评指正!