我有以下 LDIF 文件来创建 ldapadmins。
dn: ou=Manager,dc=example,dc=org
objectClass: organizationalUnit
objectClass: top
ou: Manager
dn: ou=Customers,dc=example,dc=org
objectClass: organizationalUnit
objectClass: top
ou: Customers
dn: cn=customerAccountAdmin,ou=Manager,dc=example,dc=org
cn: customerAccountAdmin
objectClass: organizationalRole
objectClass: simpleSecurityObject
objectClass: top
userPassword: {SSHA}*removed*
dn: ou=Users,ou=Customers,dc=example,dc=org
objectClass: organizationalUnit
objectClass: top
ou: Users
dn: ou=Groups,ou=Customers,dc=example,dc=org
objectClass: organizationalUnit
objectClass: top
ou: Groups
我创建了以下 ldif 以允许 phpldap 管理员有多个管理员。(他们将管理多个客户)
dn: olcDatabase={1}mdb,cn=config
changetype: modify
delete: olcAccess
-
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by dn="cn=admin,dc=example,dc=org" write by anonymous auth by * none
olcAccess: {1}to * by self read by dn="cn=admin,dc=example,dc=org" write by * none
olcAccess: {2}to * by dn.base="cn=customerAccountAdmin,ou=Manager,dc=example,dc=org" write
登录到 phpldap 管理员后,customerAccountAdmin 无法看到树。但从 ALC 视图来看,它应该拥有所有权限。
我是否遗漏了什么?有没有更简单的方法来实现此目的?
答案1
access
您的问题来自于指令的评估顺序:
在这个优先级中,访问指令按照它们在配置文件中出现的顺序进行检查。Slapd 停止于第一的
<what>
与条目和/或属性匹配的选择器。相应的访问指令是 slapd 将用来评估访问权限的指令。
(参见访问控制评估)。这意味着您的第二个to *
指令永远不会被评估,并且第一个指令适用于所有条目。
您应该修改访问规则如下:
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: to attrs=userPassword,shadowLastChange
by self write
by dn="cn=admin,dc=example,dc=org" write
by anonymous auth
by * none
olcAccess: to *
by self read
by dn="cn=admin,dc=example,dc=org" write
by dn.base="cn=customerAccountAdmin,ou=Manager,dc=example,dc=org" write
by * none
另一种选择(结合你的上一个问题)是创建一个cn=Administrators,dc=example,dc=org
组,并授予该组成员对所有内容的写权限:
dn: cn=Administrators,dc=example,dc=org
changetype: add
cn: Administrators
objectClass: groupOfNames
member: cn=customerAccountAdmin,ou=Manager,dc=example,dc=org
member: cn=admin,dc=example,dc=org
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: to dn.exact="cn=Administrators,dc=example,dc=org"
by dn.exact="cn=admin,dc=example,dc=org" write
by * none
olcAccess: to attrs=userPassword,shadowLastChange
by self write
by group.exact="cn=Administrators,dc=example,dc=org" write
by anonymous auth
by * none
olcAccess: to *
by self read
by group.exact="cn=Administrators,dc=example,dc=org" write
by * none
replace: olcAccess
编辑:值得一提的是,如果您仍在使用默认值,则在添加之前使用或删除非常重要olcAccess
。add: olcAccess
不删除默认值olcAccess
将不起作用,因为它不会覆盖它。