我有一个 Web 应用程序,需要能够在 LDAP 上创建用户。我已经创建了cn=intranet,dc=example,dc=com
,我需要它能够在 之外添加用户ou=People,dc=example,dc=com
。
因此,我尝试cn=intranet
使用以下属性添加用户:
dn = "uid=something,ou=People,dc=telecom-etude,dc=com"
attrs = {
cn: 'something',
givenName: 'something',
sn: 'something',
uid: 'something',
displayName: 'something',
objectClass: ["inetOrgPerson", 'top', 'Person' ],
}
ldap = Devise::LDAP::Connection.admin # returns a Net::LDAP binding with `cn=intranet`
ldap.add(dn: dn, attributes: attrs)
无论我做什么,我似乎都陷入了
(Net::LDAP) LDAP Creation ERROR : #<OpenStruct code=50, error_message="no write access to parent", matched_dn="", message="Insufficient Access Rights">
(phpmyldap) 0x32 (LDAP_INSUFFICIENT_ACCESS)
我已经尝试过(意思是,非最佳但绝对有效?)以下内容:
第一个条目用于备份,忽略它(除非它真的相关?)
olcAccess: {0}to attrs=userPassword,shadowLastChange,sambaLMPassword,sambaNTPa
ssword,sambaPwdLastSet by self write by anonymous auth by dn="cn=admin,dc=example,dc=com" write by dn="cn=jarvisrepl,dc=example,dc=com" write
by * none
olcAccess: {1}to dn.base="" by * read
oclAccess: {2}to * by dn="intranet,dc=example,dc=com" write
olcAccess: {3}to * by self write by dn="cn=admin,dc=example,dc=com" writ
e by * read
oclAccess: {4}to * by dn="intranet,dc=example,dc=com" write
我尝试使用通配符 * 来访问 cn="intranet",并将 oclAccess 置于默认访问 ({3}) 之后和之前,但即使这样也不起作用,我不明白为什么。
否则,从我读到的内容来看,我想要的最佳工作配置应该是这个:
olcAccess: {1}to dn.base="" by * read
oclAccess: {2}to dn.base="ou=People,dc=example,dc=com" attributes=children by dn="intranet,dc=example,dc=com" write
oclAccess: {3}to dn.onelevel="ou=People,dc=example,dc=com" by dn="intranet,dc=example,dc=com" write
olcAccess: {4}to * by self write by dn="cn=admin,dc=example,dc=com" writ
e by * read
答案1
您必须将
"to * by * write"
规则一直移动到{0}
插槽,然后才允许您的cn=intranet
用户更新或创建新用户。
我相信这可能是因为插槽 {0} 中的默认 ACL 是:“to attrs=userPassword by self write by anonymous auth by * none”,尽管稍后在配置中有了新规则,但它仍会阻止对 userPassword 属性的访问。
看来顺序很重要,而且其他规则也会对最终结果产生很大的影响。