Подтвердить что ты не робот

Как добиться аутентификации с помощью django-auth-ldap?

У меня есть приложение, использующее django. Теперь я хочу, чтобы только пользователи, прошедшие проверку подлинности через сервер openldap, увидели "их представление" (поэтому мне нужно только их uid после успешной проверки подлинности)

Как я могу это достичь?

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

Я использовал документацию для параметра settings.py, но я не смог узнать, как ее использовать. Может, кто-то может указать мне в правильном направлении?

settings.py:

import ldap

AUTHENTICATION_BACKENDS = (
    'django_auth_ldap.backend.LDAPBackend',
    'django.contrib.auth.backends.ModelBackend',
)

AUTH_LDAP_SERVER_URI = "ldap://123.60.56.61"

AUTH_LDAP_BIND_DN = ""
AUTH_LDAP_BIND_PASSWORD = ""
AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s,dc=rd,dc=corpintra,dc=net"

(Кстати: я уже могу выполнить ldap-поисковик с python-ldap и получить результаты, подобные ldapsearch в командной строке, так что все остальное работает просто отлично...)

Что мне нужно в моих представлениях?

Спасибо за вашу помощь!

4b9b3361

Ответ 1

Вот фрагмент с одного из наших сайтов.

# Django Auth Ldap
main_dn = 'dc=____,dc=organisation,dc=com'
groups_dn = 'ou=Groups,'+main_dn
users_dn = 'ou=Users,'+main_dn

AUTHENTICATION_BACKENDS = (
    'django_auth_ldap.backend.LDAPBackend',
    'django.contrib.auth.backends.ModelBackend',
)

AUTH_LDAP_SERVER_URI = "ldap://ldap.organisation.com"
AUTH_LDAP_BIND_DN = 'cn=___,'+main_dn
AUTH_LDAP_BIND_PASSWORD = "__________________"
AUTH_LDAP_USER_SEARCH = LDAPSearch(users_dn, 2, "(uid=%(user)s)")
AUTH_LDAP_USER_ATTR_MAP = {
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail"
}
AUTH_LDAP_MIRROR_GROUPS = True
AUTH_LDAP_ALWAYS_UPDATE_USER = True
AUTH_LDAP_GROUP_TYPE = PosixGroupType()
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(groups_dn, ldap.SCOPE_SUBTREE, "(objectClass=posixGroup)")

AUTH_LDAP_USER_FLAGS_BY_GROUP = {
    "is_staff":         "cn=admins,"+groups_dn,
    "is_superuser":     "cn=developers,"+groups_dn,
}

EDIT:

Поскольку вопрос "Что мне нужно в моих представлениях?", ответ заключается в том, что этот конфиг будет сохранять пользовательский uid в качестве поля имени пользователя в модели User, поэтому в ваших представлениях вам нужно

uid = request.user.username

Надеюсь, это заставило вас работать.

Ответ 2

Так как django-auth-ldap является обычным сервером аутентификации Django, request.user должен быть установлен для аутентифицированного пользователя (при условии, что у вас установлено стандартное промежуточное программное обеспечение и— см. документы Django). При обычной настройке request.user.username будет uid для пользовательского DN. Если вам нужна дополнительная информация, вы можете получить ее из request.user.ldap_user.

Ответ 3

Я не использую django-auth-ldap, я пишу свой собственный ldap файл аутентификации.

#define your backend authentification
AUTHENTICATION_BACKENDS = (
    'netipa.managment.ldapwm.netipaldapdjango.NetIpaLdap',
    #'django.contrib.auth.backends.ModelBackend ',
)

Дополнительные сведения о расширении модели пользователя см. в https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#specifying-a-custom-user-model

#!/usr/bin/env python
#coding:utf-8
# Author:  peter --<[email protected]>
# Created: 22/04/12 
from django.conf import settings
import ldap
#this is a abstrac class to add some custom fields to the default django User model
#see https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#specifying-a-custom-user-model, for more informacion
from netipa.contrib.accesos.models import LdapUsers as User    
from django.contrib.auth.backends import ModelBackend
#import logging


class NetIpaLdap(object):

    supports_inactive_user = False

    def authenticate(self, username=None, password=None):
#        logging.basicConfig(format='%(asctime)s %(message)s',filename="/tmp/auth.log",level=logging.DEBUG)

        if username is None:
            return None

        try:
            # a variable define in settings
            ip_server = settings.LDAP_BASES.get('ip')
            userdn = settings.LDAP_BASES.get('users')
            ldap.initialize('ldap://%s' % ip_server)
            lop =  ldap.simple_bind_s(
                                            "uid=%s,%s" % (username, userdn),
                                            password
                                            )
        except ldap.LDAPError, e:
            print e
            return None
        except Exception,e:
            print e
            return None

        try:
            user = User.objects.get(username=username)
        except User.DoesNotExist:
            ldap_at = lop.search(settings.LDAP_BASES.get('users'),
                                                    fil='uid=%s' % username,
                                                    types=1,
                                                    attr=['uidnumber', 'mail'])
            user = User(username=username, password=password, ldap_id=ldap_at[0][-1].get('uidnumber')[0],
                        ldap_mail=ldap_at[0][-1].get('mail')[0])
            user.is_staff = True
            user.is_superuser = True
            user.save()
        return user

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

Вот моя расширенная модель класса пользователя

from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.

class LdapUsers(AbstractUser):
    ldap_id = models.IntegerField()
    ldap_mail = models.EmailField()