因此,我正在尝试编写一些 LDAP 规则,以允许某些人编写一些子树。
假设我们有这个用户:
dn: uid=minion1,o=mycompany,ou=cust,dc=some,dc=domain
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
isAdmin: TRUE
还有这个用户:
dn: uid=minion2,o=mycompany,ou=cust,dc=some,dc=domain
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
isAdmin: FALSE
哦,还有这位用户:
dn: uid=minion3,o=notmycompany,ou=cust,dc=some,dc=domain
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
isAdmin: FALSE
我正在尝试设置 minion1 的权限来修改 minion2 的账户,但不能设置 minion3 的权限(如果你看一下,minion3 在不同的组织“notmycompany”中,而其他两个在“mycompany”中)。
基本规则是,如果“isAdmin”属性设置为 TRUE,并且对象与他/她希望修改的用户位于同一组织中,则用户应该能够添加/修改/删除其组织中的条目。
我的部分工作的 ACL 是:
to dn.regex="^.+o=([^,]+),ou=cust,dc=some,dc=domain$"
by set="user/isAdmin & [TRUE]" write
这当然也允许他们修改 minion3 的账户。我想补充一下
"[^.+,o=$1,ou=cust,dc=some,dc=domain$]"
按照上面的指示去做,但到目前为止我失败了。有人有什么好主意可以让我试试吗?(我在这里充分解释了我试图做什么吗)?
提前致谢;
答案1
我花了一些时间浏览集合文档,而您遇到的问题是集合运算符(如&
)实际上只对同一类型的数据起作用……因此您可以要求 DN 与 DN 的交集,或者属性值与字符串的交集,但不同类型的事物的交集是没有意义的。
因此,我们使用属性isAdmin
和字符串连接的奇妙之处来构建一个字符串,如下所示:
olcAccess: {1}to dn.regex="o=([^,]+),ou=cust,dc=some,dc=domain$"
by set.expand="([admin=] + user/isAdmin + [,] + user/-1) & ([admin=TRUE] + [,o=$1,ou=cust,dc=some,dc=domain])" write
by * break
请注意 的用户set.expand
,因为我们想要$1
在集合定义中使用,并注意使用[...]
将文字值放入我们正在评估的字符串中。
对于以 身份登录的用户minion1
,这将要求提供以下交集:
admin=TRUE,o=mycompany,ou=cust,dc=some,dc=domain
和文字值:
admin=TRUE,o=mycompany,ou=cust,dc=some,dc=domain
这是一个非空集,因此它有效。对于具有isAdmin=FALSE
(或没有isAdmin
)属性的人,比较将是admin=FALSE,...
或admin=,...
。同样,对于与目标不在同一组织中的人o=...
,交集将产生一个空集。
如果你有兴趣,这是我实际用于测试的。我使用employeeType
而不是isAdmin
因为我不想在向架构中添加新属性时浪费时间。
另外:slapd -dacl ...
是你的朋友。