chat
是什么?
下面我给你一份 既通俗易懂、又适合架构设计层面的 LDAP 全面讲解。 不会讲得太学术,但比网上碎片化信息更系统、完整。
🧩 1. LDAP 是什么?
LDAP = Lightweight Directory Access Protocol
直译:轻量级目录访问协议。 它不是一个软件,而是一套 查询目录结构数据的协议。
更接地气一点说:
LDAP 是一个能存企业人员账号、组织架构、权限信息的树形数据库,并且能通过标准协议进行查询和认证。
企业里常见的用户目录系统,如:
- Windows AD(Active Directory)
- OpenLDAP
- 389 Directory Server
- Apache Directory
本质上都遵循 LDAP 协议。
🏢 2. 企业为什么需要 LDAP?
因为企业里 “用户” 是跨系统的:
- 邮件系统
- VPN
- GitLab
- Jenkins
- 内网门户
- SSO 单点登录
每个都要登录,如果每个系统的用户不统一,简直灾难。
所以企业需要一个集中目录,统一管理:
- 员工账号(username)
- 密码
- 手机、邮箱、部门、职位
- 角色、权限(少部分存)
- 入职、离职、禁用统一同步
这个统一目录一般就是 LDAP 或 Active Directory。
🌲 3. LDAP 最大的特点:树结构(Tree)
不像 MySQL 的表,LDAP 用的是:
dc=example,dc=com
├── ou=People
│ ├── uid=zhangsan
│ └── uid=lisi
└── ou=Groups
├── cn=admins
└── cn=dev
关键词:
- dc(domain component)域名:example.com → dc=example,dc=com
- ou(organizational unit)组织(部门)
- uid(user id)用户
- cn(common name)名字(多用于组)
所以 LDAP 最核心就是:
所有数据都以树状方式组织,通过 DN 唯一定位。
例如用户:
uid=zhangsan,ou=People,dc=example,dc=com
这就是用户的唯一标识(就像数据库主键)。
🔐 4. LDAP 最重要的两个功能
✔(1)认证(Authentication)
LDAP 可以验证账号/密码是否正确:
你的系统会尝试用:
DN = uid=zhangsan,ou=People,dc=example,dc=com
password = ****
绑定(bind)LDAP 服务器,如果成功 → 用户存在且密码正确。
这就像你用 SSH 登录服务器一样。
✔(2)查询用户信息(Directory)
LDAP 是用来“查询”的,不是用来做 CRUD 的主数据存储。
可以查询:
- 某用户所在部门
- 部门下有哪些人
- 某组下有哪些成员
- 某个属性(如邮箱)
典型查询:
base: ou=People,dc=example,dc=com
filter: (uid=zhangsan)
attributes: cn, mail, mobile
👥 5. LDAP 适合存什么数据?
非常典型的:
| 字段 | 例子 |
|---|---|
| uid | zhangsan |
| cn | 张三 |
| sn | San |
| zhangsan@example.com | |
| mobile | 13800138000 |
| department | 技术部 |
| title | 高级工程师 |
| userPassword | 加密密码 |
LDAP 不适合存:
- 日志
- 大字段
- 高频变更数据
- 列表型数据(如帖子、订单)
它是“目录”,不是关系型数据库。
🏛️ 6. LDAP 与 AD 有什么关系?
Active Directory(Windows 域控)是:
微软实现的 LDAP + Kerberos + 域策略 + 组策略 + 计算机管理的超集
也就是说:
- AD 中 用户数据的部分就是 LDAP
- 所以 SSO、VPN、GitLab 也都可以集成 AD(用的就是 LDAP 协议)
企业里 80% 的“LDAP 集成”,其实就是“连接 Windows AD”。
🎯 7. LDAP 与 MySQL 用户体系的关系?
两者定位完全不同:
| 项目 | MySQL | LDAP |
|---|---|---|
| 本质 | 数据库 | 目录服务(树结构) |
| 用户标识 | id | DN |
| 密码校验 | 由系统业务判断 | LDAP 服务器判断 |
| 适合场景 | 小系统本地登录 | 企业级 SSO、统一身份 |
| 用户同步 | 本地业务系统管理 | 企业 IT 部门统一维护 |
你要做的是:
本地 MySQL 用户表 + LDAP 用户同步/映射 + 登录策略可配置
这样就能支持企业接入 LDAP/AD。
📡 8. LDAP 登录验证原理(你系统需要实现的)
流程很简单:
🔹 步骤 1:根据配置拼用户 DN
例如:
配置:
uid={0},ou=People,dc=example,dc=com
用户输入: zhangsan
拼成:
uid=zhangsan,ou=People,dc=example,dc=com
🔹 步骤 2:LDAP Bind 认证密码
ldap.bind(dn=拼好的DN, password)
成功 → 密码正确 失败 → 密码错误
🔹 步骤 3:读取用户属性
cn, mail, mobile, department, title...
🔹 步骤 4:同步/更新到你的本地 user 表
如果 user 不存在 → insert 存在 → update 部门、邮箱、真实姓名等
并记录:
source_type = LDAP
🔹 步骤 5:进入你本地登录流程(JWT、TOTP、冻结逻辑)
🧪 9. LDAP 测试方式(个人开发者也能用)
你可用:
✔ Docker 启动 OpenLDAP(最推荐)
5 分钟即可模拟企业 LDAP。
✔ phpldapadmin
可视化管理界面。
我已经告诉你完整步骤(你需要我再贴一次也可以)。
🧱 10. 总结(让你记得住)
用一句话概括 LDAP:
LDAP 是企业专用的用户目录协议,可以用来统一账号体系、验证密码、查询用户信息,并被各种系统用于单点登录与统一身份认证。
你作为个人开发者常见的需求:
- 如何连接 LDAP?
- 如何绑定 DN?
- 如何同步用户?
- 如何设计兼容 LDAP 的登录体系?
- 如何给 SaaS 用户支持“本地 + LDAP”两种策略?
你现在做 Passport,这正是 LDAP 的典型场景。
