1

モジュールを使用ldap3して、ldap サーバーでユーザーを検索するための単純な Web アプリを作成しようとしています。ユーザー (通常、検索を行うヘルプ デスク担当者) は、ログインして検索対象のユーザーを入力する必要があります。これまでのコードは LDAP サーバーを作成/バインドし、検索されたユーザーを見つけると、ユーザーの資格情報を示す別のページが表示されます。ここまでは順調ですね。

資格証明を表示するページには検索ボックスがあり、ユーザーは別のユーザーを再度検索できます。私が今抱えている問題は、ldap 経由でログインしたままにする方法です。これにより、ユーザーは検索されたユーザーを入力するだけで済みます (ユーザー名とパスワードを再度入力する必要はありません)。返されたオブジェクトを解析する必要があると考えてconnいますが、どういうわけかこれは少しぎこちないようです。これが私のコードです:

ビュー.py

def ldap_authentication(request):             
    if request.POST:
        username = request.POST['username']
        LDAP_MODIFY_PASS = request.POST['password']
        searchFilter = request.POST['searchUser']
        LDAP_AUTH_SEARCH_DN = '{}\\{}'.format(settings.DOMAIN_NAME, username)    

        conn = ldap_connect(request, un=LDAP_AUTH_SEARCH_DN, pw=LDAP_MODIFY_PASS)

        attributes_list_keys = ['mail', 'givenName', 'employeeID', 
        'department', 'telephoneNumber', 'st', 'cn', 'l', 'title']

        conn.search(
                search_base=settings.LDAP_AUTH_SEARCH_BASE,
                search_filter= '(cn={})'.format(searchFilter), 
                search_scope=SUBTREE, 
                attributes = attributes_list_keys
                ) 

        entry = conn.entries[0]

        attributes_split = list(entry._attributes.values())
        attr_keys = []
        attr_values = []
        for i in attributes_split:
            attr_keys.append(i.key)
            attr_values.append(i.value)
        attributes = zip(attr_keys, attr_values)

        return render(request, 'search_page.html', {'attributes':attributes})

    return render(request, 'login.html')

def ldap_connect(request, un=None, pw=None):    
    try:
        # Define the server
        server = Server(settings.LDAP_SERVER, get_info=ALL)
        # Connection and Bind operation 
        conn = Connection(server, user=un, password=pw, \
                        auto_bind=True,check_names=True)
        conn.start_tls() # Session now on a secure channel.
        return conn

    except LDAPBindError as e:
        print ("LDAPBindError, credentials incorrect: {0}".format(e))
        logger.debug("LDAPBindError, credentials incorrect: {0}".format(e))
        sys.exit(1) 

    except LDAPSocketOpenError as e:
        print ("LDAPSocketOpenError, LDAP Server connection error: {0}".format(e))
        logger.debug("LDAPSocketOpenError, LDAP Server connection error: {0}".format(e))
        sys.exit(1)  

def search_ldap_user(request):
    if request.POST:
        searchFilter = request.POST['searchUser']
        print ("searchFilter_POST: {0}".format(searchFilter))
        return render(request, 'login.html')

search_page.html

{% extends "base.html" %}
{% load static %}

{% block content %}
<div class="page-header">
    <h2>LDAP Search Page</h2>
</div>
<p><p>
<div class="tab-content">
        <div class="tab-pane active" id="tab1">
            <table class="table table-striped table-condensed" 
            id="orders_open">
            <thead>
            <tr>
                <th>Attribute in LDAP</th>
                <th>Value</th>
            </tr>
            </thead>
            {% for item1, item2 in attributes %}
            <tr>
                <td>{{ item1 }}</td>
                <td>{{ item2 }}</td>
            </tr>
            {% endfor %}
            </table>
        </div>
</div>
<br><br><br><br>

<form method='post' action="{% url 'searchAnother' %}" class="form-signin">
{% csrf_token %}
    <input type="text" class="form-control" name="searchUser" 
    placeholder="Search User" required=""/>
    <button type="submit">Search</button>
</form> 
<form method='post' action="" class="form-signin">{% csrf_token %}
        <br>
        <a href="{% url 'logout' %}" class="btn btn-lg btn-danger btn-
block">LogOut</a>
</form>

{% endblock content %}

login.html

{% extends "base.html" %}
{% load static %}

{% block content %}
<div class="page-header">
        <h2>Welcome to LDAP Search. Please enter your credentials.</h2>
</div>

<div class="wrapper">
    <form method='post' action="" class="form-signin">{% csrf_token %}
        <h3 class="form-signin-heading">Please login</h3>
        <input type="text" class="form-control" name="username" 
        placeholder="Username" required="" autofocus=""/>
        <br>
        <input type="password" class="form-control" name="password" 
        placeholder="Password" required=""/>
        <br>
        <input type="text" class="form-control" name="searchUser" 
        placeholder="Search User" required=""/>
        <br>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Login</button>
    </form>
</div>

{% endblock content %}

search_ldap_user問題は、何らかの方法で my の関数をconn オブジェクトを介してリンクしていると思いますが、これをどのように行うかは不明views.pyです。search_page.html認証に LDAP を使用した同様の経験はありますか?

アップデート

django_python3_ldapそこで、次のようにライブラリに切り替えました。

設定.py

DOMAIN_NAME = 'OurDomain'
LDAP_AUTH_URL = 'ldap://10.254.9.31:389'                    
LDAP_AUTH_USE_TLS = False                                   
LDAP_AUTH_SEARCH_BASE = 'ou=company-Konzern, dc=ourdomain, dc=de' 
LDAP_AUTH_OBJECT_CLASS = 'inetOrgPerson'                    

LDAP_AUTH_USER_FIELDS = {
    "username": "cn",
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail",
}

# More info: https://github.com/etianen/django-python3-ldap
#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_openldap"
LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN = 'OurDomain'

#LDAP_AUTH_CONNECTION_USERNAME = 'e123456'
LDAP_AUTH_CONNECTION_USERNAME = 'OurDomain\e123456'
LDAP_AUTH_CONNECTION_PASSWORD = 'abcdefghi'

LDAP_AUTH_CONNECT_TIMEOUT = None
LDAP_AUTH_RECEIVE_TIMEOUT = None

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

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_python3_ldap'
]

ビュー.py

def ldap_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        print ("username: {0}".format(username))
        print ("password: {0}".format(password))
        ldap_auth_search_dn = '{}\\{}'.format(settings.DOMAIN_NAME, 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))
        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')

コメントアウトされた行からわかるように、settings.py で構成のさまざまな順列を試しましたが、まだ不明な問題がいくつかあります。

  1. これは settings.py: で必須LDAP_AUTH_OBJECT_CLASSですか?
  2. 正しいLDAP_AUTH_USER_LOOKUP_FIELDS使い方はどれ?
  3. 2 と同じですが、LDAP_AUTH_CONNECTION_USERNAME(これにはドメインが含まれているはずですか)?

コマンドを使用すると、次のエラー メッセージがスローされます。

python ./manage.py ldap_sync_users

エラー:

CommandError: Could not connect to LDAP server

コマンドを使用せずに単にサーバーを実行すると、print ステートメントの が として返されるldap_sync_usersため、接続がないように見えます。ライブラリを使用した以前のコードが機能するため、接続が機能することを資格情報で知っています。私が考えることができる唯一のことは、両方のライブラリ間で同じではないということです。userNoneldap3LDAP_AUTH_SEARCH_BASE

4

1 に答える 1