2013-03-27 27 views
11

Mam aplikację uruchamianą przy użyciu django. Teraz chcę, aby tylko użytkownicy, którzy są uwierzytelnieni przez serwer openldap, zobaczyli "ich widok" (dlatego potrzebuję ich tylko po pomyślnym uwierzytelnieniu).Jak uzyskać uwierzytelnianie za pomocą django-auth-ldap?

Jak mogę to osiągnąć?

Domyślam się, że django-auth-ldap jest drogą do zrobienia, więc próbowałem przez cały dzień, aby dowiedzieć się, gdzie faktycznie odbywa się uwierzytelnianie i jak uzyskać identyfikator użytkownika żądającego widoku.

Użyłem documentation for the settings.py, ale nie mogłem się dowiedzieć, jak "faktycznie z niego korzystać". Może ktoś może wskazać mi właściwy kierunek?

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" 

(Przy okazji: ja już może wykonywać LDAP searche z python-ldap i uzyskać wyniki jak ldapsearch w linii poleceń, więc wszystko działa dobrze ...)

Czego potrzebuję w moich poglądach?

Dzięki za pomoc!

+0

czy rzeczywiście potrzebujemy UID LDAP osoby, lub tylko unikalny identyfikator osoby w systemie? – Thomas

Odpowiedz

6

Oto fragment z jednej z naszych stron.

# 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:

Ponieważ pytanie jest „? Czego potrzebuję w moich poglądów”, odpowiedź jest taka, że ​​ten config uratuje UID użytkownika jako pole nazwę użytkownika na modelu użytkownika, więc w twoje poglądy, potrzebujesz

Mam nadzieję, że to cię uruchomi.

+0

Pytanie to: "Czego potrzebuję w moich poglądach?" – shailenTJ

+0

@shailenTJ Zaktualizowałem moją odpowiedź – Thomas

+0

Hej @ user982809, jeśli ta odpowiedź ci pomogła, rozważ oznaczenie jej jako zaakceptowaną. – Thomas

2

Ponieważ django-auth-ldap jest normalnym backendem uwierzytelniania Django, request.user powinien być ustawiony na uwierzytelnionego użytkownika (zakładając, że masz zainstalowane standardowe oprogramowanie pośrednie — zobacz dokumentację Django). Przy typowym ustawieniu, request.user.username będzie identyfikatorem użytkownika DN. Jeśli potrzebujesz więcej informacji, możesz uzyskać go od request.user.ldap_user.

1

Nie używam django-auth-ldap, piszę własne zaplecze uwierzytelniające ldap.

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

uzyskać więcej informacji na temat rozszerzenia modelu użytkownika, patrz 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's 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 

Tu jest moja przedłużyć użytkownika klasy modelu

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() 
Powiązane problemy