Redis缓存与LDAP协议集成:认证授权平台环境配置方案 - 第2节
2.1 LDAP 目录服务模型:从树形结构理解身份数据组织
LDAP(轻量级目录访问协议)的核心思想是将用户、设备、组织等身份资源组织成树形目录,而非关系型数据库的表结构。这种模型天然适合读多写少、层级分明的认证授权场景。
2.1.1 目录信息树(DIT)
LDAP 目录以 DIT(Directory Information Tree) 为基本框架,每个节点称为 条目(Entry),每个条目由一组属性构成,并通过 DN(Distinguished Name) 唯一标识。
| 术语 | 含义 | 示例 |
|---|---|---|
| DN | 条目的全局唯一路径 | cn=zhangsan,ou=people,dc=example,dc=com |
| RDN | 相对可辨识名称,DN 中最左部分 | cn=zhangsan |
| Base DN | 搜索起点,通常为组织根 | dc=example,dc=com |
| OU | 组织单元,用于分组 | ou=people、ou=groups |
| CN | 通用名称,常为用户或设备名 | cn=zhangsan |
下图展示了一个典型的企业 LDAP 目录树结构,根节点为域名组件,向下按组织单元划分用户、组、应用等分支。
2.1.2 条目与属性模型
每个 LDAP 条目必须包含一个 objectClass 属性,用于定义该条目允许或必须包含哪些属性。常见的 objectClass 包括:
- top:所有条目的抽象基类。
- person:包含
cn、sn(姓)等属性。 - organizationalPerson:继承 person,增加
title、telephoneNumber等。 - inetOrgPerson:扩展自 organizationalPerson,支持
uid、mail、employeeNumber等。 - groupOfNames:用于定义组成员,包含
member属性。
uid、cn、mail、memberOf 等关键属性,避免缓存整个条目的大对象。
2.2 LDAP 数据交换格式(LDIF):目录数据的文本化表示
LDIF 是 LDAP 的标准文本格式,用于导入/导出目录数据、修改条目或描述目录结构。每一条记录由 DN 开头,后跟若干属性-值对,空行分隔不同条目。
2.2.1 LDIF 基本语法
# 这是一个注释
dn: cn=zhangsan,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: zhangsan
sn: Zhang
uid: zhang.san
mail: zhangsan@example.com
userPassword: {SSHA}加密密码哈希值
telephoneNumber: +86-10-12345678
dn: cn=developers,ou=groups,dc=example,dc=com
objectClass: groupOfNames
objectClass: top
cn: developers
member: cn=zhangsan,ou=people,dc=example,dc=com
member: cn=lisi,ou=people,dc=example,dc=com
2.2.2 LDIF 操作类型
| 操作 | LDIF 关键字 | 说明 |
|---|---|---|
| 添加条目 | dn: ... + 属性列表 |
直接写入新条目,必须包含所有必填属性 |
| 修改条目 | changetype: modify |
配合 add:、replace:、delete: 子操作 |
| 删除条目 | changetype: delete |
删除指定 DN 的条目(不能删除非叶节点) |
| 重命名/移动 | changetype: modrdn |
修改 RDN 或移动条目到新父节点 |
2.2.3 修改操作示例
dn: cn=zhangsan,ou=people,dc=example,dc=com
changetype: modify
replace: mail
mail: new.zhangsan@example.com
-
add: telephoneNumber
telephoneNumber: +86-10-87654321
-
dn 必须为第一行。密码字段 userPassword 应使用 SSHA、SHA 或 bcrypt 等哈希存储,禁止明文。
2.3 LDAP 操作类型:Bind / Search / Modify
LDAP 协议定义了多种操作,其中 Bind、Search、Modify 是认证授权平台中最核心的三种。下面分别说明其流程与参数。
2.3.1 Bind 操作:认证与会话建立
Bind 操作用于客户端向 LDAP 服务器证明身份,分为匿名绑定、简单绑定(明文密码)和 SASL 绑定(Kerberos、GSSAPI 等)。在 Redis 缓存集成中,通常使用简单绑定验证用户密码。
// 简单绑定请求示例(使用 LDAP 协议 ASN.1 编码前的逻辑表示)
BindRequest := {
version: 3,
name: "cn=zhangsan,ou=people,dc=example,dc=com",
authentication: simple {
password: "用户明文密码"
}
}
Bind 响应包含结果码:0 表示成功,49 表示无效凭证,53 表示不愿执行等。
2.3.2 Search 操作:目录查询与过滤
Search 是 LDAP 最常用的读操作,支持丰富的过滤条件。在 Redis 缓存场景中,Search 用于获取用户属性、组成员关系等。
| 参数 | 说明 | 示例值 |
|---|---|---|
| baseObject | 搜索起点 DN | dc=example,dc=com |
| scope | 搜索范围:base / onelevel / subtree | subtree |
| filter | LDAP 过滤表达式 | (&(objectClass=inetOrgPerson)(uid=zhang.san)) |
| attributes | 返回属性列表,空数组表示返回所有 | ["uid", "cn", "mail", "memberOf"] |
常用 LDAP 过滤器示例:
(uid=zhang.san)— 精确匹配用户 ID(&(objectClass=inetOrgPerson)(mail=*@example.com))— 查找某域名的所有用户(|(cn=admin*)(uid=admin*))— 查找名称或 ID 以 admin 开头的条目(memberOf=cn=developers,ou=groups,dc=example,dc=com)— 查找属于 developers 组的用户
2.3.3 Modify 操作:属性更新与密码修改
Modify 操作用于更新已有条目的属性,支持添加、替换、删除三种子操作。在认证平台中,常用于密码修改、用户信息更新。
// 修改用户密码的 LDAP 操作(使用 LDIF 表示)
dn: cn=zhangsan,ou=people,dc=example,dc=com
changetype: modify
replace: userPassword
userPassword: {SSHA}新密码哈希值
-
2.4 三种操作在认证授权中的协作流程
下图展示了 Bind、Search、Modify 在典型认证授权场景中的调用顺序与数据流向。
2.5 本章小结
- LDAP 目录服务模型以 DIT 树形结构组织身份数据,DN 为全局唯一标识,OU/CN 为常用组织单元。
- LDIF 是目录数据的文本交换格式,支持添加、修改、删除、重命名四种操作,适合批量导入与备份。
- Bind 负责认证,Search 负责查询,Modify 负责更新;三者结合可覆盖认证授权平台的全部身份生命周期管理需求。
- 在 Redis 缓存集成中,Search 结果应设置 TTL,Modify 后应主动失效缓存,确保数据一致性。