2017-01-19 34 views
3

Я пытаюсь аутентифицировать пользователя с сервером LDAP в django.Django-Ldap-Authentication

Я настроил мой settings.py следующим образом:

AUTH_LDAP_SERVER_URI = "ldap.forumsys.com" 
AUTH_LDAP_BIND_DN = "cn=read-only-admin,dc=example,dc=com" 
AUTH_LDAP_BIND_PASSWORD = "password" 
AUTH_LDAP_USER_SEARCH = LDAPSearch("dc=example,dc=com", 
    ldap.SCOPE_SUBTREE, "(uid=%(user)s)") 
AUTH_LDAP_START_TLS = True 


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

В моих взглядах я пытался проверить подлинность его с LDAPBACKEND

from django.http import HttpResponse 
from django_auth_ldap.backend import LDAPBackend 
from django.contrib.auth.models import User 


from django.conf import settings 


def login_user(request): 

    state = "" 

    username = settings.AUTH_LDAP_BIND_DN 
    password = settings.AUTH_LDAP_BIND_PASSWORD 

    auth = LDAPBackend() 

    try: 
     User = auth.authenticate(username=username,password=password) 
     if User is not None: 
      state = "Valid" 

     else: 
      state = "Invalid" 

    except LDAPError as e: 
      state = "Error" 

    return HttpResponse(state) 

Но я получаю сообщение об ошибке, как

LDAPError при аутентификации cn = read-only-admin, dc = example, dc = com: LDAPError (0, 'Error')

И у меня есть еще одно сомнение. Являются ли username и password такими же как bind_username и bind_password?

ответ

0

Я бы рекомендовал использовать представление, основанное на классе. Кроме того, вы должны назначить username и password с помощью ввода пользователя.

Также вы должны использовать только функцию authenticate().

from django.contrib.auth import authenticate 

class LoginView(FormView): 
    form_class = LoginForm 
    success_url = reverse_lazy('main') 
    template_name = 'module_name/login.html' 

    def form_valid(self, form): 
     username = form.cleaned_data['username'] 
     password = form.cleaned_data['password'] 
     user = authenticate(username=username, password=password) 

     if user is not None and user.is_active: 
      login(self.request, user) 
       return super(LoginView, self).form_valid(form) 
     else: 
      return self.form_invalid(form) 
+0

Это также не: /. Теперь я получаю сообщение об ошибке SERVER_DOWN ({«desc»: «Не удается связаться с сервером LDAP»},) –

+0

Тогда я думаю, что ваши настройки неверны. Вы пытались получить доступ с помощью ldap-инструмента для подключения к серверу? Также добавьте порт в URL-адрес, например 'AUTH_LDAP_SERVER_URI = 'ldap: //ldap.forumsys.com: 636" 'и проверьте, есть ли у вас tls или ldaps. – ikreb

2

Мой опыт работы с LDAP не требовал каких-либо изменений вида. Я использовал библиотеку Джанго-Auth-Ldap, который требуется только дополнительные настройки для использования:

#-----------------------------------------------------------------------------# 
# 
# LDAP Settings 
# 
#-----------------------------------------------------------------------------# 

AUTHENTICATION_BACKENDS += ('django_auth_ldap.backend.LDAPBackend',) 

AUTH_LDAP_SERVER_URI = "ldaps://your.ldap.server" 

AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s,ou=users,dc=example,dc=com" 

Использование связывания Войти работает, а с этими дополнительными параметрами:

import ldap 
from django_auth_ldap.config import LDAPSearch 

AUTH_LDAP_BIND_DN = "<user>" 
AUTH_LDAP_BIND_PASSWORD = "<password>" 
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=example,dc=com",ldap.SCOPE_SUBTREE, "(uid=%(user)s)") 

Нормальный Джанго вид входа в систему работают нормально с эта настройка.

EDIT: Я должен добавить, что необходимо подтвердить, что LDAP работает через командную строку на сервере перед попыткой использования Django. Это то, что заставило меня поначалу.

1

Убедитесь, что AUTH_LDAP_SERVER_URI должно быть именем хоста или IP-адресом AD. В Джанго settings.py:

AUTH_LDAP_SERVER_URI = "ldap://hostname or Ip address of active directory" 
AUTH_LDAP_BIND_DN = "CN=sAMAccountName,CN=Users,DC=yourdomain,DC=com" 
AUTH_LDAP_BIND_PASSWORD = ******* 
AUTH_LDAP_CONNECTION_OPTIONS = { 
    ldap.OPT_REFERRALS: 0, 
} 
AUTH_LDAP_USER_SEARCH = LDAPSearch('CN=Users,DC=yourdomain,DC=com', 
ldap.SCOPE_SUBTREE, "userPrincipalName=%(user)s") 

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

И views.py должны быть такими,

from django.contrib.auth import views as auth_views 
from forms import ProjectRequestForm, ExAuthenticationForm 

def login(request): 
    return auth_views.login(request, template_name='login.html', authentication_form=ExAuthenticationForm)