38

私は Django を初めて使用し、LDAP をバックエンドとして使用するユーザー認証システムを実装するタスクを割り当てられました。ドキュメンテーションは、最終開発者が Django で十分な経験を持ち、そのようなシステムを理解して実装できることを前提としていると思います。これは、LDAP ベースの認証を使用して単純な django アプリケーションを実装する方法を理解できないところです。これが私がこれまでに理解したことです:

変更をファイルに投稿するだけ:

settings.py
....
import ldap
from django_auth_ldap.config import LDAPSearch

AUTH_LDAP_SERVER_URI = "ldap://<my url>" 
AUTHENTICATION_BACKENDS = ('django_auth_ldap.backend.LDAPBackend')

AUTH_LDAP_CONNECTION_OPTIONS = { 
    ldap.OPT_REFERRALS: 0
}

MIDDLEWARE_CLASSES = ( 
     ....
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    ...
)

INSTALLED_APPS = ( 
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    ....
)

auth.html

<html>
    <head>
        <title>Login</title>
    </head>
    <body>
        {{state}}
        <form action="" method="post"> {% csrf_token %}
            Email address: <input type="text" name="email" value="{{ email }}" />
            Password: <input type="password" name="password" value="" />
            <input type="submit" value="Log in" />
        </form>
    </body>
</html>

models.py:

??

ビュー.py:

from django.shortcuts import render_to_response
from django.contrib.auth import authenticate, login
from django.template import RequestContext


def login_user(request):

    username = password = ""
    state = ""

    if request.POST:
        username = request.POST.get('username')
        password = request.POST.get('password')

        print username, password

        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user)
            state = "Valid account"
        else:
            state = "Inactive account"
    return render_to_response('auth_user/auth.html', RequestContext(request, {'state': state, 'username': username}))

私が理解できないことは何ですか?

1> の値views.pyを取得して検証するには、関数を実装する必要があると確信しています。たとえば、 [SO]です。ドキュメントでは、検索/バインドまたは直接バインドのいずれかを実装するように指定されています。なんで?認証コードの実際の部分が含まれる場合、ドキュメントで指定されているコードは何を行っていますか? POSTemailpasswordviews.py

2>views.pyが実際の認証を実行する場合、なぜドキュメントで指定された変数が必要なのですか?

3> 作成者はライブラリで素晴らしい仕事をしましたが、ドキュメントには、LDAP を使用して認証システム全体を実装する方法の単純なベアボーンの例が提供されていません。そのようなリソースが存在する場合、誰でも指摘できますか? このようなシステムを実装するために追加/変更する必要があるファイルを理解するのは簡単ではありません。

4

2 に答える 2

34

このページには、探しているものが含まれている可能性があります: LDAP バックエンドに関するhttps://pypi.python.org/pypi/django-auth-ldap 。幸運なことに、認証バックエンドが存在するので、自分で認証バックエンドをコーディングする必要はありません:-)

基本的に、django.contrib.auth.models には、ユーザーに関して必要なすべてを含む User オブジェクトが既にあります。したがって、新しい models.py を作成する必要はありません。

を使用して、ログイン関数で、views.py で自分自身を認証する必要があります。

from django.contrib.auth import authenticate, login
user = authenticate(username=request.REQUEST.get('email'), password=request.REQUEST.get('password'))
# handle error cases, inactive users, ...
login(request, user)

ユーザーが None の場合、認証は失敗しました。そうでない場合は、このオブジェクトを調べて、バックエンドがプルしたものを確認できます。

次に、ユーザーをforeignKeyとして別のモデルを作成することを選択できます。これは、設定をこのアプリケーションのこのユーザーにリンクしたままにしたいが、LDAPの一部にはリンクさせたくない場合です。

この場合、次のものが必要です。

モデル.py

アプリケーションに基づく重要なデータの定義。LDAP からユーザー データを取得し、このモデルにそのデータと、ユーザーにリンクされたその他の設定を入力します。

from django.contrib.auth.models import User    

class Profile(models.Model):
    """User profile.  Contains some basic configurable settings"""
    user = models.ForeignKey(User, unique=True)
    phone_number = models.CharField(max_length=256, blank=True, default='')
    ...

Views.py

  • ログイン関数で、request.method == 'POST' の場合、認証から取得したばかりのユーザーを使用してユーザー プロファイルを get_or_create します。

    profile, profile_is_new = Profile.objects.get_or_create(user=user)
    
于 2013-11-12T22:12:11.880 に答える
7

django-auth-ldap ドキュメントは、Django に精通している開発者向けに書かれています。また、LDAP。ゼロから始める場合は、一度に 1 つずつ実行することをお勧めします。

  1. ジャンゴのチュートリアル
  2. Django 認証
  3. まだ慣れていない場合は、ある種の LDAP チュートリアル。
  4. ジャンゴ認証 LDAP
于 2013-11-13T03:16:29.750 に答える