Я пытаюсь сохранить разрешения ACL для LDAP. У меня есть разрешение для пользователей и для групп (пользователь принадлежит ко многим группам). Вот структура, которую я создаю:
ou=Groups
cn=Admin [posixGroup] {memberUid=andrew, memberUid=johny}
cn=Right {resource:ftp1, action:all}
cn=Right {resource:ftp2, action:all}
cn=Editor [posixGroup] {memberUid=joseph}
cn=Right {resource:ftp1, action:list}
ou=People
cn=andrew {uid=andrew}
cn=Right {resource:ftp3, action:all}
cn=johny {uid=johny}
cn=joseph {uid=joseph}
в скобках указаны атрибуты {}. Что ж, когда Эндрю подключится к ftp3, я хотел бы проверить разрешения, поэтому я спрашиваю:
(|(memberUid=andrew)(uid=andrew))
но я получаю только родительские элементы cn = Rights: cn = andrew и cn = Admin. Можно ли написать запрос для возврата элементов cn = Right с использованием фильтра по элементам memberUid uid, определенным в родительских элементах? Или нужно как-то изменить структуру. Спасибо вам большое за ваше время. Андрей
Я считаю, что с вашей текущей схемой вам нужно будет выполнить два набора запросов:
Right
запись, установка базовое DN к записи, которую вы нашли на шаге 1.Или вы можете изменить структуру, чтобы пользователи и группы имели многозначные right
записи, возможно, что-то вроде:
cn=Admin [posixGroup] {memberUid=andrew, memberUid=johny,
right: ftp1/all, right: ftp2/all}
cn=Editor [posixGroup] {memberUid=joseph, right: ftp1/list}
...
cn=andrew {uid=andrew, right: ftp3/all}
Ваш запрос будет таким же, но вы получите right
атрибуты в возвращаемом наборе (без дополнительных запросов). Или, если вы знаете уровень обслуживания и разрешений, запрошенные во время запроса, вы также можете указать это:
(&((|(memberUid=andrew)(uid=andrew)))(right=ftp3/all))
Если вы получили хотя бы один результат, значит, вы можете предоставить доступ; в противном случае запретить доступ.