基于LDAP轻量级目录协议的用户管理方式

LDAP协议入门

LDAP是一种通讯协议,支持TCP/IP。在这套标准下,有多种的实现方式,比如OpenLDAP、微软大佬的AD(Active Directory)。拿AD来举例子,LDAP有点像是数据库一样,但是又不完全是,读起来非常快、写起来慢一点。同时它也有Server端Client端,其中Server端用来存放资源,Client端用来操作增删改查等操作,即AD = LDAP服务器 + LDAP应用

与数据库不同的地方是,数据库是按照记录一条条存放在表中,而LDAP数据库是树结构的,数据存储在叶子节点上。下面举个例子来说明一下树结构上的一条记录是如何定义的。

# 描述:苹果是在树的东边那个分叉上的靠西边那个分叉的再靠北边的分叉上的半红半绿的。

树 (dc=tree)
分叉 (ou=bei,ou=xi,ou=dong)
苹果 (cn=redApple)

# 综合起来描述为
dn:cn=redApple,ou=bei,ou=xi,ou=dong,dc=tree

一个完整的LDAP树形结构数据库应包含以下几个因素:

dn: 一条记录的详细位置
dc: 一条记录所属的区域(即哪一棵树)
ou: 一条记录所属的组织(即哪一个分支)
cn/uid: 一条记录的名字/ID(即哪一个苹果名字)
LDAP目录树的最顶部就是根,也就是所谓的"基准DN"

为什么要用LDAP目录树来存储数据,用MySQL不行吗?

如何操作LDAP服务器?

LDAP服务器的客户端操作方式有很多种,常见的有JDBC、JNDI、phpLDAPadmin等。由于本人不怎么用Java,所以首选phpLDAPadmin来进行实战操作。

采用Docker快速部署

其实在Ubuntu上安装OpenLDAP和phpLDAPadmin两个软件是比较简单的,使用sudo apt install openldap phpldapadmin -y即可完成,但是配置起来就有点小麻烦了,不大适合对LDAP没有深入了解的人使用,最简单的方式就是使用别人已经封装好的Docker镜像进行快速部署。docker-compose.yml文件内容如下:

version: '2'

services:
    phpldapadmin:
      image: osixia/phpldapadmin
      environment:
        PHPLDAPADMIN_LDAP_HOSTS: openldap
      links:
        - openldap
      ports:
        - 6443:443
      restart: always
    openldap:
      image: osixia/openldap
      environment:
        LDAP_ORGANISATION: "example"
        LDAP_DOMAIN: example.org
        LDAP_ADMIN_PASSWORD: admin
      volumes:
        - ./data/slapd/database:/var/lib/ldap
        - ./data/slapd/config:/etc/ldap/slapd.d
      restart: always
      ports:
        - 389:389
        - 689:689

访问

安装完成之后使用https://localhost:6443即可访问phpLDAPadmin,Login DN 为 cn=admin,dc=example,dc=org,Password 为admin

参考资料

LDAP入门

OpenLDAP and phpLDAPadmin running in Docker containers