如何在作为代理使用的slapd中重写LDAP属性?
如何在作为代理使用的slapd中重写LDAP属性?
嘿,其实你用的rwm(Rewrite/Remap)overlay完全能处理属性重写的需求,只是很多资料都把重点放在DN改写上,容易让人误以为它只能做这个。我帮你梳理一下具体的实现步骤,刚好匹配你要剥离用户ID前缀、提取数字作为POSIX ID的场景:
1. 确认rwm overlay已正确加载
首先得确保你的slapd支持rwm模块:
- 运行
slapd -V查看输出,如果能看到overlay=rwm的字样,说明模块已经编译进slapd了;如果没有,可能需要重新编译slapd并启用rwm模块,或者通过动态加载的方式添加(具体取决于你的系统配置)。 - 在你的代理LDAP数据库配置段(通常是
database ldap的区块,因为是代理模式)中添加加载指令:overlay rwm
2. 配置属性重写规则
针对你提到的“用户ID以1-2个非必要字母开头,后面跟着8-9位数字”的场景,我们可以用rwm的正则映射规则来剥离前缀、提取数字,生成POSIX所需的uidNumber/gidNumber属性:
示例配置(适配你的需求)
假设源LDAP中的用户ID存在uid属性里,我们要把它转换成uidNumber:
# 把uid属性的前缀字母剥离,提取数字作为uidNumber rwm-map attribute uid uidNumber regex "^[A-Za-z]+([0-9]{8,9})$" "$1" # 如果组ID也是类似结构,同样处理gid到gidNumber的映射 rwm-map attribute gid gidNumber regex "^[A-Za-z]+([0-9]{8,9})$" "$1"
规则解释:
rwm-map attribute:声明这是一条属性映射规则- 第一个参数
uid是源属性名(存储带前缀的用户ID的属性),第二个参数uidNumber是目标属性名(要生成的POSIX属性) regex "^[A-Za-z]+([0-9]{8,9})$":正则匹配规则,^[A-Za-z]+匹配开头的1个或多个字母,([0-9]{8,9})$匹配后面的8-9位数字并将其捕获为分组1"$1":替换值,直接引用捕获到的数字分组,作为目标属性的内容
3. 测试与排障
配置完成后,记得重启slapd生效,然后用ldapsearch测试:
ldapsearch -x -b "ou=users,dc=yourdomain,dc=com" uid=AB12345678 uidNumber
如果返回结果里能看到正确的uidNumber属性,说明规则生效了。
如果没生效,可以检查:
- slapd的日志文件(通常在
/var/log/syslog或/var/log/ldap/slapd.log),看看有没有正则语法错误、属性不存在这类报错 - 确认规则是写在代理数据库的配置段里,而不是全局配置中
- 如果有部分用户ID没有前缀,可以把正则调整为
^[A-Za-z]*([0-9]{8,9})$,允许前缀为空的情况
备注:内容来源于stack exchange,提问作者Ralequi
相关产品推荐
相关产品推荐

