我正在尝试使用 net_ldap ruby gem 连接到运行 slapd 的 LDAP 服务器。我可以使用用户的 cn 执行绑定操作,但我需要使用 uid。
LDAP 服务器由 ClearOS 创建,并且未经修改,是标准配置。
这是我的红宝石代码:
Net::LDAP.new(
{
host: "10.1.1.3",
port: 389,
base: "dc=company,dc=lan",
auth: {
method: :simple,
username: 'cn=Andrew Faraday,ou=Users,ou=Accounts,dc=company,dc=lan',
password: "secret"
}
}
).bind
这很好用,但我真正想要的是使用 uid 而不是 cn 登录,例如
username: 'uid=ajfaraday,ou=Users,ou=Accounts,dc=company,dc=lan',
以下是成功的 ldap 搜索的结果(经过大量删改):
dn: cn=Andrew Faraday,ou=Users,ou=Accounts,dc=edge,dc=lan
uidNumber: 2004
gidNumber: 63000
homeDirectory: /home/ajfaraday
clearAccountStatus: enabled
sambaAcctFlags: [U ]
sambaDomainName: company
sambaBadPasswordCount: 0
sambaBadPasswordTime: 0
uid: ajfaraday
givenName: Andrew
sn: Faraday
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
objectClass: clearAccount
objectClass: sambaSamAccount
cn: Andrew Faraday
loginShell: /bin/bash
我花了几天时间研究 slap 配置文件、手册和有关这个问题的旧问题(大概有十多年了),但一无所获。我尝试了所有这些方法的变体:
- 定义一条规则,为每个用户构建不同的 DN。
- 允许对uid属性的授权权限。
- 设置 authz-regexp 或 sasl-regexp 以将输入转换为查找 uid 的搜索字符串。
这些似乎都没有达到预期的效果。regexp 属性似乎根本没有起到任何作用。
答案1
有LDAP
两种身份验证方式:简单机制和SASL
。
您使用的简单机制要求您绑定到精确的专有名称。因此,如果您想使用用户名而不是全名,则必须DN
按照以下LDIF
说明更改:
dn: cn=Andrew Faraday, ou=Users, ou=Accounts, dc=company, dc=lan
changetype: modrdn
newrdn: uid=ajfaraday
deleteoldrdn: 0
但是,SASL
机制更加灵活,您可以将任何登录名映射到LDAP
条目。您还可以执行LDAP
搜索以查找您的DN
。例如,如果您添加重写规则:
dn: cn=config
changetype: modify
add: olcAuthzRegexp
olcAuthzRegexp: gidNumber=([0-9]*)\+uidNumber=([0-9]*),cn=peercred,cn=external,cn=auth
ldap:///ou=Users,ou=Accounts,dc=edge,dc=lan??sub?(&(gidNumber=$1)(uidNumber=$2))
LDAP
您可以通过 Unix 套接字进行本地身份验证:
ldapsearch -H ldapi:/// -Y EXTERNAL
评论: 你需要重新开始更改属性后服务器olcAuthzRegexp
才会将其考虑在内。