在django-python3-ldap中没有确认身份验证(用户名=用户名,密码=密码)

时间:2017-11-06 10:03:33

标签: python-3.x ldap django-1.11 python-ldap

我正在尝试开发一个相对简单的Web应用程序,它要求用户通过LDAP登录,然后如果成功登录,用户就可以在LDAP服务器中搜索其他用户。这是管理员的应用程序。到目前为止,代码创建/绑定到ldap服务器,并在找到搜索到的用户后,显示一个显示用户凭据的不同页面。已通过ldap3库确认通过正确凭据进行连接。

在显示搜索到的用户的凭证的第二个网页(他的用户名,电子邮件,手机号码等)上,有一个搜索框,以便用户可以再次搜索另一个用户。因此,不再需要登录。我现在遇到的问题是如何通过ldap保持登录状态,这样用户只需要输入搜索到的用户(而不是输入他的用户名和密码)。

我的代码:

settings.py

ALLOWED_HOSTS = ['127.0.0.1']

LDAP_AUTH_URL = 'ldap://10.253.53.53:389'                   
LDAP_AUTH_USE_TLS = None                                   # Initiate TLS on connection.
LDAP_AUTH_SEARCH_BASE = 'dc=vkbads,dc=de'  # The LDAP search base for looking up users.
LDAP_AUTH_OBJECT_CLASS = 'inetOrgPerson'                    # The LDAP class that represents a user.
LDAP_AUTH_USER_FIELDS = {
    "username": "cn",
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail",
}

#LDAP_AUTH_USER_LOOKUP_FIELDS = ("username",)
LDAP_AUTH_USER_LOOKUP_FIELDS = ("cn",)
LDAP_AUTH_CLEAN_USER_DATA = "django_python3_ldap.utils.clean_user_data"
LDAP_AUTH_SYNC_USER_RELATIONS = "django_python3_ldap.utils.sync_user_relations"
LDAP_AUTH_FORMAT_SEARCH_FILTERS = "django_python3_ldap.utils.format_search_filters"
LDAP_AUTH_FORMAT_USERNAME = "django_python3_ldap.utils.format_username_active_directory"
LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN = 'COMPANY'
LDAP_AUTH_CONNECTION_USERNAME = None
#LDAP_AUTH_CONNECTION_USERNAME = 'COMPANY\\e000520'
LDAP_AUTH_CONNECTION_PASSWORD = None 
LDAP_AUTH_CONNECT_TIMEOUT = None
LDAP_AUTH_RECEIVE_TIMEOUT = None
AUTHENTICATION_BACKENDS = (  
    'django_python3_ldap.auth.LDAPBackend',
    'django.contrib.auth.backends.ModelBackend',
)

views.py

def ldap_login(request): #This corresponds to my homepage
    if request.POST:
        username = request.POST['username']
        password = request.POST['password']
        print ("username: {0}".format(username))
        print ("password: {0}".format(password))
        ldap_auth_search_dn = '{}\\{}'.format(settings.LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN, username)    
        print ("ldap_auth_search_dn: {0}".format(ldap_auth_search_dn))

        user = authenticate(username=username, password=password)
        #user = authenticate(username=ldap_auth_search_dn, password=password)
        print ("user: {0}".format(user))
        #login(request, user, backend='django_python3_ldap.auth.LDAPBackend')
        # Test return values
        if user and user.is_active:
            print ("user.is_active!!")
            login(request, user, backend='django_python3_ldap.auth.LDAPBackend')

    return render(request, 'login_ldap.html')

奇怪的是没有抛出错误消息,但是我的代码的功能也没有按预期工作。起初,我无法正常连接并且正在接收: CommandError: Could not connect to LDAP server

但后来由于一些友好的建议而想出我需要更改我的设置以适应AD而不是OpenLDAP。顺便说一下,我正在使用Python3和Django1.11。

这引出了一些关于我配置的问题:

  1. 请注意view.py中的打印语句。这些是验证un / pw和用户状态。当执行runserver时,会给出通常的Django输出("Performing system checks..."等)。然后,令人惊讶的是,一旦刷新了主页,就会给出以下内容: username: last_username_I_input password: last_password_I_input ldap_auth_search_dn: COMPANY\ last_username_I_input user: None (i)在我将这些详细信息输入网页的字段之前,为什么要使用我的上一个凭据?为什么我的最后一个凭据存储了,有没有办法以某种方式自动重置这些?我尝试了一个“python manage.py flush”,这似乎有效。仅当ctrl+c似乎没有刷新凭据时。 (ii)即使我在我的页面上输入un / pw凭据并单击login,然后print语句显示新的(和正确的)凭据,“user”仍然是None,但我不明白为什么。为什么我的用户凭据未进行身份验证?

  2. 不可否认,我不是Django也不是LDAP专家,所以有些设置对我来说还不清楚。也许更好的理解可以帮助我实现正确的配置: (i)LDAP_AUTH_USE_TLS的正确参数是什么? (ii)LDAP_AUTH_SEARCH_BASE通常应该如何?它包括例如“ou”吗? (iii)LDAP_AUTH_CONNECTION_USERNAMELDAP_AUTH_CONNECTION_PASSWORD是否应包含un / pw,如果这些是我登录页面上要求的内容? (iv)LDAP_AUTH_OBJECT_CLASS的内容对我来说不清楚,我不确定这里应该包含哪些参数。有小费吗? (v)与(iv)相同,但适用于LDAP_AUTH_USER_FIELDS

0 个答案:

没有答案