2012-07-01 3 views
1

Я пытаюсь изменить аутентификатор на основе python для murmur (voip software) для работы с моим деревом ldap.запрос атрибута python ldap

Аутентификатор LDAP доступен по адресу:

http://www.winex.org/linux/zealot/src/mumble-scripts/Authenticators/LDAP/LDAPauth.py

Это работает, но не совсем с моей макет Ldap, так что я должен изменить его немного. Я знаю подход, который мог бы работать, но, к сожалению, я больше не знаю о питоне, чем о том, что я узнал из Google (у меня есть еще какой-то опыт программирования).

Мой макет LDAP выглядит следующим образом:

charName=xxx, ou=people, dc=xxx, dc=com 

Под этим есть атрибуты хранятся такие как userPassword и login среди других.

Сценарий python, приведенный выше, предназначен для использования привязки ldap для аутентификации. В этом случае мне пришлось бы связывать "charName=logindatafromapp, ou=people, dc=xxx, dc=com". К сожалению, люди не входят в систему с "charName", но с "login", который является атрибутом, но не идентичен "charName".

Я не знаю, как связываться с атрибутом, так вот моя идея:

  • Я первый противоречива, как Ldap администратора и выполнить поиск по всем записям для "logindatafromapp" и соответствовать этому значение против "login". Если совпадение найдено, я возьму соответствующий "charName" и перевяжу с этим charName, как первоначально предполагалось.

В настоящее время я застрял на запрашивая значение "charName" и при присвоении этого значения переменной, так что я мог бы использовать его во втором Ldap связывания (Google не реально помочь мне).

Вот мой код:

ldap_conn = ldap.initialize(ldap_uri, 0) 
ldap_conn.bind_s("cn=admin,dc=xxxxxxxx,dc=com","pass") 
res = ldap_conn.search_s('ou=people,dc=xxxxxx,dc=com', ldap.SCOPE_ONELEVEL,'login=trony',['charName']) 
print(res) 

Затем печатает "[('charName=Trony,ou=people,dc=xxxxxxx,dc=com', {'charName': ['Trony']})]".

("login=trony") - временный фильтр, который мне пришлось бы заменить на applogin var. Моя проблема заключается в том, как я могу назначить "Trony" (в данном случае) переменной? Результат кажется специальной структурой?

ответ

2

«Trony» в

res[0][1]['charName'][0] 

Берешь первый элемент списка - это кортеж; то первый элемент кортежа; это словарь; затем значение словаря для ключа «charName»; это список еще раз; а затем первый элемент списка.

+0

спасибо большое :), "name = res [0] [0] {'charName'} [0]« не работает », говорит синтаксическая ошибка. – user912877

+0

не забудьте принять ответ :) –

+0

более конкретно: Файл «./LDAPauth.py», строка 205 test = res [0] [0] {'charName'} [0] ^ Синтаксис: недействительный синтаксис – user912877

0

Есть по крайней мере две альтернативы:

  • Используйте метод, который вы описали для поиска записи, используя информацию, которую вы, в этом случае значение атрибута login, введенный пользователем, а затем с помощью DN, которое было найдено в простой или SASL-связи или
  • Используйте SASL с идентификационным отображением для сопоставления authId (значение атрибута login) таким образом, что связка SASL будет успешной, когда только значение атрибута login известен

Первый метод требует поиска, а затем привязки, второй может потребовать, чтобы записи пользователей имели обратимые пароли (AES - хорошая схема шифрования для этой цели) в зависимости от выбранного механизма SASL. Использование SASL с механизмом DIGEST-MD5 обеспечит способ сопоставления идентификаторов, как описано (все серверы LDAP профессионального качества поддерживают такой механизм сопоставления), и избавит от необходимости отправлять пароль в режиме очистки по сети, но имеет недостаток от того, чтобы быть столь же безопасным, как использование простого связывания, где пароль хранится в виде засоленного SHA-2 дайджеста. Хотя DIGEST-MD5 не следует использовать, потому что он требует обратимых паролей и, следовательно, не настолько безопасен, как использование сильного SHA-2 (с солью), он доступен для приложений, которые этого требуют.

Смежные вопросы