Как поддерживать аутентификацию LDAP через представления Django?

Вот текущая ситуация: я создал страницу login.html, где я ввожу свое имя пользователя и пароль в форме. В моем views.py Я получаю данные POST и использую имя пользователя и пароль для аутентификации на моем сервере LDAP (механизм работает). Если имя пользователя / пароль неверны, я возвращаюсь на страницу входа с сообщением об ошибке. В противном случае я буду перенаправлен на целевую страницу, где у меня будет сообщение типа: "Здравствуйте, Фамилия, Имя". Я могу получить имя и фамилию из запроса LDAP.

Эта проблема:

Когда я перехожу к новому виду, то есть к целевой странице, я теряю свою аутентификацию. Когда я прослеживаю request.userЯ получаю администратора, которого использовал при создании проекта Django. Я ожидаю, что экосистема Django_auth сделает все это за меня, но, возможно, я ошибаюсь.

Я не уверен, должен ли я помещать пользователя в сеанс, потому что я не смог найти нигде в Google, где люди используют LDAP и Session Django вместе.

Я был бы признателен за любую помощь от гуру там.

Благодарю.

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

def login(request):
    error = False
    DN = 'None'
    user = 'None'
    user_attr = 'None'
    if request.method == 'POST': #if form has been submitted
        DN = request.POST['login']
        PWD = request.POST['password']
        DN_FULL_EMAIL = DN + '@'+user_domain+'.mysite.com'
        print 'DN_FULL_EMAIL', DN_FULL_EMAIL
        try:
            l = ldap.initialize('ldap://mysite.com:3268')
            print 'bind_res = ' , l.simple_bind_s(DN_FULL_EMAIL, PWD)
            BASE_DN = 'DC=eng,DC=mysite,DC=com'
            SCOPE = ldap.SCOPE_SUBTREE
            Filter = '(&(objectClass=person)(sAMAccountName='+DN+'*)(objectClass=organizationalPerson)(objectClass=user))'
            Attrs = ['displayName', 'employeeID'] #The only data we need

            r= l.search_ext(BASE_DN, SCOPE, Filter, Attrs)
            Type, user = l.result(r,10)
            if user :
                Name, Attrs = user[0]
                if hasattr(Attrs, 'has_key') and Attrs.has_key('displayName') and Attrs.has_key('employeeID'):
                    displayName = Attrs['displayName'][0]
                    WWID = Attrs['employeeID'][0]
                request.user = user
                user_attr = Attrs
                return HttpResponseRedirect('/', {  'user' : user,
                                                    'user_attr' : user_attr
                                                })

        except ImportError:
            error = True
            pass
        except ldap.INVALID_CREDENTIALS:
            error = True
            pass
    return render_to_response( 'login.html', {
        'error' : error,
        'user' : user,
        'user_attr' : user_attr
        }, context_instance = RequestContext(request))

2 ответа

Решение

Вы почти наверняка захотите использовать сервер аутентификации LDAP, такой как django-auth-ldap. Если серверная часть установлена ​​и настроена правильно, ваши представления не должны требовать никакого кода, специфичного для LDAP. Если вы запутались, не бойтесь начать все сначала и следуйте документации бэкэнда с самого начала.

Теперь, когда вы внедрили аутентификацию LDAP вручную с помощью python-ldap, все, что вам нужно знать, это как использовать сеанс в разных представлениях.

К счастью, Django предоставляет хороший документ об этом: как использовать сессии.

Пример кода:

request.session['name'] = 'Jack'  # set
name = request.session['name']    # get
Другие вопросы по тегам