2013-08-12 2 views
1

Текущая ситуация: Я создал страницу login.html, где я ввожу свое имя пользователя и пароль в форме. В моем views.py я получаю данные POST и использую имя пользователя и пароль для аутентификации на моем сервере LDAP (работает механизм). Если имя пользователя/пароль неверно, я перенаправляется обратно на страницу входа с сообщением об ошибке. В противном случае, я перенаправляется на целевую страницу, где у меня будет сообщение вроде: «Hello Lastname, Firstname». Я могу получить имя и фамилию из запроса LDAP.Как поддерживать аутентификацию LDAP через представления Django?

Проблема:

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

Я не уверен, должен ли я помещать пользователя в сеанс, потому что я не мог найти нигде в Google, где люди используют LDAP и сеанс 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)) 
+0

Вы не дают достаточно информации, чтобы решить эту проблему. Что вы делаете с результатом аутентификации LDAP? Используете ли вы библиотеку для интеграции LDAP с картой аутентификации Django? –

+0

Вы используете бэкэнд аутентификации ldap, или вы «вручную» выполняете аутентификацию? –

+0

@ Даниэль и Бурхан, спасибо за быстрый ответ. Я добавил код, который я использовал в своем проекте. Из подсказки от Burhan, я считаю, что делаю что-то вручную, и я ничего не делаю с результатом LDAP. 'request.user = user' также не полезен, поскольку изменение данных, которые вы уже получили, ничего не делает. Тогда, может быть, как я действительно использую бэкэнд аутентификации LDAP? У меня есть настройки, такие как AUTH_LDAP_SERVER, AUTH_BASE_USER и т. Д. В моем 'settings.py', и я добавил' django_ldapbackend.LDAPBackend' в мои AUTHENTICATION_BACKENDS. Оттуда я не уверен, как правильно поступать. – shailenTJ

ответ

1

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

+0

Вскоре после отправки этого вопроса я перешел к 'django-auth-ldap'. У меня есть все настройки LDAP в моей 'settings.py'. В моем 'login.html', у меня есть имя пользователя/пароль. Когда я нажимаю «Вход», данные POST отправляются соответствующему методу в моей «view.py». Большой вопрос: что мне делать для аутентификации на моем LDAP-сервере, используя настройки из моего 'settings.py'? Спасибо за поддержку! – shailenTJ

+0

Просто используйте стандартные API Django (https://docs.djangoproject.com/en/1.5/topics/auth/default/#authentication-in-web-requests). django.contrib.auth даже включает стандартный вход в систему, поэтому вам не нужно писать код просмотра для простых случаев. – psagers

0

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

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

Пример кода:

request.session['name'] = 'Jack' # set 
name = request.session['name'] # get