Итак, я пытаюсь написать некоторые правила 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 значение ИСТИНА, И если объект находится в той же организации, что и пользователь, которого он / она хочет изменить.
Мой частично рабочий 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$]"
на строчку выше, но до сих пор я с треском провалился. Есть ли у кого-нибудь хорошие идеи, которые я могу попробовать? (Я адекватно объяснил, что пытаюсь здесь сделать)?
Заранее спасибо;
Я потратил некоторое время на просмотр документация на наборы, и проблема в том, что операторы набора (например, &
) действительно работают только с данными одного типа ... поэтому вы можете запросить пересечение 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 ...
твой друг.