Понимание аутентификации Django-LDAP

Я новичок в Django, и мне было поручено реализовать систему аутентификации пользователей с LDAP в качестве бэкэнда. Я предполагаю, что документация предполагает, что конечный разработчик имеет достаточный опыт работы с Django, чтобы понять и внедрить такую ​​систему. Здесь я не понимаю, как реализовать простое приложение django с аутентификацией на основе LDAP. Вот что я понял до сих пор:

Только публикация изменений в файл:

settings.py
....
import ldap
from django_auth_ldap.config import LDAPSearch

AUTH_LDAP_SERVER_URI = "ldap://<my url>" 
AUTHENTICATION_BACKENDS = ('django_auth_ldap.backend.LDAPBackend')

AUTH_LDAP_CONNECTION_OPTIONS = { 
    ldap.OPT_REFERRALS: 0
}

MIDDLEWARE_CLASSES = ( 
     ....
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    ...
)

INSTALLED_APPS = ( 
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    ....
)

auth.html

<html>
    <head>
        <title>Login</title>
    </head>
    <body>
        {{state}}
        <form action="" method="post"> {% csrf_token %}
            Email address: <input type="text" name="email" value="{{ email }}" />
            Password: <input type="password" name="password" value="" />
            <input type="submit" value="Log in" />
        </form>
    </body>
</html>

models.py:

??

views.py:

from django.shortcuts import render_to_response
from django.contrib.auth import authenticate, login
from django.template import RequestContext


def login_user(request):

    username = password = ""
    state = ""

    if request.POST:
        username = request.POST.get('username')
        password = request.POST.get('password')

        print username, password

        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user)
            state = "Valid account"
        else:
            state = "Inactive account"
    return render_to_response('auth_user/auth.html', RequestContext(request, {'state': state, 'username': username}))

Что я не могу понять?

1> Я уверен, что мне нужно реализовать функцию в views.py чтобы получить POST значения для email а также password и подтвердите это, например: [SO]. В документации указывается либо реализация Search/Bind, либо Direct Bind. Зачем? Если views.py будет содержать фактический код аутентификации, что делает код, указанный в документации?

2> Если views.py будет выполнять фактическую аутентификацию, тогда зачем нам переменная, указанная в документации?

3> Автор проделал большую работу с библиотекой, но документация не содержит простой пример того, как реализовать всю систему аутентификации с LDAP. Может ли кто-нибудь указать на такой ресурс, если он существует? Нелегко понять файлы, которые необходимо добавить / изменить для реализации такой системы.

2 ответа

На этой странице может быть то, что вы ищете: https://pypi.python.org/pypi/django-auth-ldap относительно бэкэнда LDAP. Вам повезло, что он существует, поэтому вам не нужно самому писать код бэкэнда аутентификации:-)

В основном django.contrib.auth.models уже имеет объект User, который содержит все, что вам нужно о пользователе. Так что вам не нужно создавать новый models.py.

Вам просто нужно аутентифицировать себя в вашем views.py, в функции входа в систему, используя

from django.contrib.auth import authenticate, login
user = authenticate(username=request.REQUEST.get('email'), password=request.REQUEST.get('password'))
# handle error cases, inactive users, ...
login(request, user)

Если пользователь Нет, аутентификация не удалась. Если нет, вы можете исследовать этот объект, чтобы увидеть, что для вас потянул бэкэнд.

Затем вы можете выбрать создание другой модели с пользователем в качестве ForeignKey, если вы хотите сохранить настройки, привязанные к этому пользователю для этого приложения, но не к LDAP.

В этом случае вам понадобится:

Models.py

Определение данных, которые важны для вас на основе вашего приложения. Вы собираетесь извлечь пользовательские данные из LDAP и заполнить эту модель ей и другими предпочтениями, связанными с пользователем:

from django.contrib.auth.models import User    

class Profile(models.Model):
    """User profile.  Contains some basic configurable settings"""
    user = models.ForeignKey(User, unique=True)
    phone_number = models.CharField(max_length=256, blank=True, default='')
    ...

Views.py

  • в функции входа в систему, если request.method == 'POST', тогда get_or_create профиль пользователя, используя пользователя, которого вы только что получили от authenticate.

    profile, profile_is_new = Profile.objects.get_or_create(user=user)
    

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

  1. Джанго учебник
  2. Аутентификация Django
  3. Какой-то учебник по LDAP, если вы еще не знакомы.
  4. Джанго-Auth-LDAP
Другие вопросы по тегам