所以,我试图编写一些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$]"
到了上面的旁边,但是到目前为止我已经惨败了。 有没有人有任何好的想法,我可以尝试? (我解释了我在这里试图做的充分)?
提前致谢;
我已经花了一些时间来查看集合上的文档 ,并且你得到的问题是集合运算符(如& )真的只能处理同一types的数据…所以你可以要求交集一个DN和一个DN,或一个属性值和一个string,但是不同types的事物的交集是没有意义的。
所以,我们使用isAdmin属性和string连接的奇迹来构build一个string,如下所示:
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 ,并且注意使用[...]将字面值放入我们正在评估的string中。
对于以minion1login的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=...作为目标,交集将产生一个空集。
如果你有兴趣, 这是我实际使用的testing。 我正在使用employeeType而不是isAdmin因为我不想在添加一个新的属性到我的模式。
另外: slapd -dacl ...是你的朋友。