11

私はdjangoを使用してアプリケーションを実行しています。 今私はopenldapサーバーを介して認証されたユーザーだけが "自分のビュー"を見るようにしたい(したがって、認証が成功した後にuidだけが必要です)django-auth-ldapで認証を行うには?

どうすればいいですか?

私はdjango-auth-ldapが行く方法だと思うので、認証が実際にどこで行われ、どのようにしてビューを要求しているユーザーのuidを取得できるのかを知ることができました。

私はdocumentation for the settings.pyを使用しましたが、「実際に使用する」方法を見つけることができませんでした。誰かが正しい方向に私を向けることができますか?

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" 

(ちなみに:私はすでにのpython-LDAPとLDAP-searcheを実行し、コマンドラインでのldapsearchのような結果を得るため、他のすべてはうまく動作しますすることができます... )

私の意見には何が必要ですか?

ありがとうございました!

+0

ユーザークラスのモデルを拡張であることがわかり、Userモデルを拡張しますが、実際に人のLDAPのUIDが必要なのか、またはシステム上の人のためのユニークな識別子? – Thomas

答えて

6

私たちのサイトのスニペットです。

# 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:「?私は私の意見では何が必要なのか」

質問があるので、答えがでて、この設定は、Userモデル上のユーザ名フィールドとして、ユーザーのuidを節約するということですあなたの意見は、あなたが必要です

uid = request.user.username 

うまくいけば、これはあなたを起動し、実行します。

+0

質問:「私の見解には何が必要なの?」 – shailenTJ

+0

@shailenTJ私の回答を更新しました – Thomas

+0

こんにちは@ user982809、この回答があなたを助けてくれたら、それを受け入れたとマークすることを検討してください。 – Thomas

2

django-auth-ldapは通常のDjango認証バックエンドなので、request.userは認証されたユーザに設定する必要があります(—がDjangoのドキュメントを参照)。標準設定では、request.user.usernameがユーザーのDNのuidになります。さらに詳しい情報が必要な場合は、request.user.ldap_userから入手できます。

1

私はdjango-auth-ldapを使用していません。私自身のLDAP認証バックエンドを作成します。詳細については

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

についてここで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 

は私

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() 
関連する問題