OpenLDAP ACL的使用集

所以,我试图编写一些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 ...是你的朋友。