Здравствуйте.
Есть вот такая структура:
dn: o=z
objectclass: organization
objectclass: top
o: z
dn: domainName=example.org,o=z
objectclass: mailDomain
objectclass: top
domainname: example.org
dn: uid=user,domainName=example.org,o=z
objectclass: account
objectclass: mailUser
objectclass: top
mail: user@example.org
uid: user
Таких domainName может быть много. Хочется ограничить доступ к информации внутри такой записи только теми, кто находится в поддереве этого domainName и чем-то выделяется.
Первый вариант (некрасивый):
Добавляем подветку
dn: ou=Admins,domainName=example.org,o=z
objectclass: organizationalUnit
objectclass: top
ou: Admins
dn: uid=postmaster,ou=Admins,domainName=example.org,o=z
objectclass: account
objectclass: mailAdmin
objectclass: top
mail: postmaster@example.org
uid: postmaster
Пишем ACL:
{0}to attrs=userPassword
by self write
by anonymous auth
by * none
{1}to dn.regex="^(.+,)?(domainName=[^,]+,o=z)$"
by dn.onelevel,expand="ou=Admins,$2" write
{2}to *
by self write
В результате, только те, кто находится в поддереве ou=Admin каждого domainName, имеют права на изменения только в в пределах собственной песочницы domainName=[^,]+,o=z .
Второй вариант (как хочется):
Добавляем только аккаунты такого вида:
dn: uid=admin,domainName=example.org,o=z
objectclass: account
objectclass: mailAdmin
objectclass: top
mail: admin@example.org
uid: admin
(см. objectClass) и переписываем этот ACL
{1}to dn.regex="^(.+,)?(domainName=[^,]+,o=z)$"
by dn.onelevel,expand="ou=Admins,$2" write
к такому виду, который понимает что в ветку dn.regex может писать только такая запись из subtree/onelevel/etc текущего domainName, которая имеет objectClass=mailAdmin.
Итак, вопрос: как это объяснить openldap'у?