ACL, на openldap организованы проверка OU и / или DN с помощью регулярного выражения
ex:
access to attrs=userPassword
by anonymous auth
by self write
by dn.base="ou=users_with_userPassword_write_access,dc=myproduct,dc=org" write
by dn.exact="cn=manager,dc=myproduct,dc=org" write
by * none
access to *
by dn.exact="cn=manager,dc=myproduct,dc=org" write
by dn.base="ou=users_with_powerfull_write_access,dc=myproduct,dc=org" write
by * none
Таким образом, в отношении dn зарегистрированного пользователя (whoami_s
сpython-ldap), вы можете определить, есть ли у пользователя какие-либо права.Вам не нужно проверять, можете ли вы записать данные, внедрите функцию в своем приложении django, которая проверяет DN.
Может быть, вы говорите, что ACL генерируются динамически?
Что касается вашего комментария, если ваш ACL является статическим, чтобы знать ACL, проще всего реализовать средство python, которое реализует эти ACL.С моим предыдущим примером:
W_ACCESS_OU = "ou=users_with_powerfull_write_access,dc=myproduct,dc=org"
def check_write_access(user_dn):
return is_dn_base(W_ACCESS_OU, user_dn)
На данный момент python-ldap не может получить списки ACL для slapd.conf ... И это не безопасно для анализа slapd.conf (потому что slapd.conf может быть«где-нибудь» в системе, и объявление ACL может быть сложным для анализа), также требуется много времени, чтобы попытаться записать данные на серверную часть LDAP.
Я знаю, что это не очень удовлетворительно.Другое решение состоит в том, чтобы использовать «пользователя службы».Только этот пользователь имеет доступ на запись в бэкэнд LDAP.
Это упрощает запись ACL:
access to *
by dn.exact="cn=manager,dc=myproduct,dc=org" write
by * none
Затем для обычных пользователей вы устанавливаете флаг авторизации.Ваше приложение проверяет флаг, когда зарегистрированный пользователь хочет что-то сделать.И если этот флаг в порядке, пользователь службы записывает данные в серверную часть.
Это стратегия, которую мы развертываем в одном из наших приложений.
В обоих случаях проверка ACL выполняетсянаше приложение, а не серверная часть ldap.