Получение информации о пользователе во Flask с помощью LDAP

Я пытаюсь найти способ получить такую ​​информацию, как 'mail', 'displayName', 'phoneNumber', от пользователя, прошедшего аутентификацию / авторизацию LDAP во Flask.

Мой пользователь может успешно пройти аутентификацию и войти в систему с помощью LDAP. Однако как я могу получить дополнительную информацию о пользователе?

Я использую стандартные модули python-ldap и flask-login, и я пытаюсь создать строковую переменную для этих атрибутов, чтобы я мог вызывать их позже в сеансе. При попытке выполнить запрос я получаю ldap.FILTER_ERROR: {'desc': u'Bad search filter'}. Любые идеи о том, как заставить это работать?

class UserInfo():
    def whoami(username, password):
        conn = get_ldap_connection()
        conn.simple_bind_s(username,password)
        basedn = 'OU=...,OU=...,DC=...,DC=...'
        userfilter = "(|(SamAccountName=\*" + username + "\*)"
        userattribute = ['displayName']
        userresults = conn.search_s(basedn,ldap.SCOPE_SUBTREE,userfilter, userattribute)

userinfos = UserInfo()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(100))

    def __init__(self, username, password):
        self.username = username

    @staticmethod
    def try_login(username, password):
        conn = get_ldap_connection()
        conn.simple_bind_s(domain+username, password)

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return unicode(self.id)

@login_manager.user_loader
def load_user(id):
    return User.query.get(int(id))

@app.before_request
def get_current_user():
    g.user = current_user

person Infinity8    schedule 03.11.2016    source источник
comment
После завершения входа в систему LDAP вам необходимо использовать Flask Login login_user используется для передачи User объекта с данными пользователя. Ознакомьтесь с примером входа, чтобы узнать, как это сделать.   -  person kiran.koduru    schedule 03.11.2016
comment
Спасибо, у меня есть настройка login_user. Он передает имя пользователя прямо сейчас, я пытаюсь найти способ передать другие атрибуты из LDAP.   -  person Infinity8    schedule 03.11.2016
comment
Итак, вы пытаетесь сказать, что столкнулись с ошибкой около conn.search_s?   -  person kiran.koduru    schedule 03.11.2016
comment
да, по сути, поиск должен искать текущего пользователя, вошедшего в систему, и получать информацию оттуда. Прямо сейчас поиск не работает, за исключением случаев, когда я использую userfilter = '(objectclass = person)', но это дает мне результаты всего LDAP.   -  person Infinity8    schedule 03.11.2016
comment
Можете ли вы порекомендовать нам пакет LDAP, который вы используете?   -  person kiran.koduru    schedule 03.11.2016
comment
импорт ldap, он же python-ldap   -  person Infinity8    schedule 03.11.2016
comment
Итак, этот? github.com/pyldap/pyldap   -  person kiran.koduru    schedule 03.11.2016
comment
Из этой статьи о поиске LDAP фильтры, это говорит о том, что вам не нужно экранировать * в вашем userfilter. Вы пробовали это?   -  person kiran.koduru    schedule 03.11.2016
comment
Также похоже, что в userfilter отсутствует закрывающая скобка ).   -  person kiran.koduru    schedule 03.11.2016
comment
userfilter = (SamAccountName = + username) ничего не возвращает [], но userfilter = (SamAccountName = bobsmith) возвращает несколько атрибутов.   -  person Infinity8    schedule 03.11.2016
comment
Что, если бы вы использовали '(SamAccountName=%s)'% name' - без пробелов и кавычек?   -  person kiran.koduru    schedule 03.11.2016
comment
который возвращает тот же ldap.FILTER_ERROR: {'desc': u'Плохой поисковый фильтр '} :(   -  person Infinity8    schedule 03.11.2016
comment
Ох, ладно. Тогда Nvm. Сделайте это так, как вы описали ранее, и это сработало для вас.   -  person kiran.koduru    schedule 03.11.2016
comment
userfilter = (& (objectClass = user) (sAMAccountName = actualusername)) работает, а введение переменной username с userfilter1 = (& (objectClass = user) + (sAMAccountName = + username +)) возвращает плохой поисковый фильтр.   -  person Infinity8    schedule 03.11.2016
comment
А что насчет '(&(objectClass=user)(sAMAccountName=%s))' % name?   -  person kiran.koduru    schedule 03.11.2016
comment
Никаких кубиков. Довольно озадаченный, поскольку эти строковые соединения кажутся прекрасными, но по какой-то причине они просто не принимают переменную.   -  person Infinity8    schedule 03.11.2016
comment
Какую версию Python вы используете?   -  person kiran.koduru    schedule 03.11.2016
comment
2.7.8 ... Глядя на этот пример stackoverflow.com/questions/140439/ OP использует переменную ... Тем не менее, когда я пробую тот же формат с именем пользователя в соответствии с моим кодом, он дает мне FILTER_ERROR! Я пробовал userfilter = (& (objectClass = user) (sAMAccountName = + username +)), но при вводе фактического имени пользователя в виде строки он работает.   -  person Infinity8    schedule 03.11.2016
comment
Я думаю, что это может быть проблема с объединением строк в python. Не могли бы вы распечатать userfilter и сказать, что вы получите?   -  person kiran.koduru    schedule 03.11.2016
comment
(& (objectClass = пользователь) (sAMAccountName = serviceaccount))   -  person Infinity8    schedule 03.11.2016
comment
Вы придумали, как решить эту проблему? Был ли ответ, который сработал?   -  person kiran.koduru    schedule 09.11.2016
comment
Пока ничего не помогло. Очень неприятный и странный вопрос. Я открыл новый вопрос, более конкретный для этой строки здесь stackoverflow.com/questions/40476182/   -  person Infinity8    schedule 09.11.2016


Ответы (1)


Мне нужно было использовать ldap.filter.filter_format для правильного экранирования символов.

import ldap.filter

criteria= ldap.filter.filter_format('(&(objectClass=user)(sAMAccountName=%s))', [username])
person Infinity8    schedule 23.11.2016