Я боролся с этим сам. Я думаю, что решение состоит в том, чтобы импортировать группы из LDAP, выполняя некоторые запросы LDAP.
Недостаток этого подхода в том, что он требует (1) вставлять группы в таблицы web2py auth_group при входе в систему FIRST. (2) Потребуется обслуживание групп, если они имеют тенденцию меняться. Это можно сделать с помощью cron или вручную.
Вы можете узнать, вошел ли пользователь ранее, как это:
query = (db.auth_event.description.like('%Logged-in%'))&(db.auth_event.user_id==auth.user.id)
if db(query).count() == 1:
# Query LDAP for group membership, update auth_group table
Вот пример кода для запроса LDAP - этот основан на простом поиске информации о пользователе (я не уверен, как LDAP организует группы - я буду писать код для извлечения групп через неделю или две):
импорт ldap
из ldap.filter импортировать filter_format как ff
ldap_attrs = ['sn','givenName','telephoneNumber', 'mail' ]
FILTER_TPL = '(&%s(objectclass=i3person))'
sch = ff('(%s=%s)', ('uid', auth.user.username))
ldap_filter = FILTER_TPL % sch
con = ldap.initialize("ldap://YOUR-LDAP-SERVER")
dn= "YOUR-DN-FOR-USERS/GROUPS"
mode = "uid"
port = 389
ldap_results = con.search_s(dn, ldap.SCOPE_SUBTREE, ldap_filter, ldap_attrs)
dn, res = ldap_results[0]
Вы можете получить больше информации о ldap python здесь:
http://www.python -ldap.org / docs.shtml
(здесь приведены примеры кода, относящиеся к группам запросов)
http://www.ibm.com/developerworks/aix/library/au-ldap_crud/
Кроме того, НЕ забывайте использовать filter_format (импортированный как ff выше), он будет избегать ваших запросов ldap, предотвращая внедрение LDAP, если какой-либо пользовательский ввод будет допущен к коду. Для моих целей я делал общедоступную форму, в которой люди искали записи LDAP.
Вот публикация о зеркалировании групп ActiveDirectory в группы LDAP. Я публикую это, потому что, хотя это и делает обратное, некоторые из них все еще полезны, в частности, фильтр для получения групп из LDAP, поскольку он одинаков для чтения или записи и использует python-ldap:
http://oxpedia.org/wiki/index.php?title=Mirorring_Active_Directory_user_acconts_in_LDAP
Если ваши группы ldap не сильно меняются, вы можете создать скрипт, который выполняет следующие действия:
- Удалить все членство в группах для учетных записей web2py (начать заново).
- Для каждого аккаунта запросите ldap для групп
- Для каждого запроса извлеките все группы.
- Скопировать группы в auth_groups, если не существует
- Добавить участника в группу (auth_membership или что-то?)
Тогда просто запускайте скрипт по мере необходимости. Мне нравится удалять вещи при запуске таких сценариев ETL, потому что тогда вы начинаете с нуля и не дублируете вещи или не сталкиваетесь с ошибками, когда вещи уже существуют и нарушают ограничения БД.