【问题标题】:How to achieve authentication with django-auth-ldap?如何使用 django-auth-ldap 实现身份验证?
【发布时间】:2013-03-18 03:25:29
【问题描述】:

我有一个使用 django 运行的应用程序。 现在我只希望通过 openldap 服务器进行身份验证的用户看到“他们的视图”(因此我只需要他们的 uid 在成功身份验证后)

我怎样才能做到这一点?

我想 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 的结果,所以其他一切都很好......)

我的观点需要什么?

感谢您的帮助!

【问题讨论】:

  • 您真的需要此人的 ldap UID,还是只需要系统上此人的唯一标识符?

标签: django ldap django-authentication openldap django-auth-ldap


【解决方案1】:

这是来自我们其中一个网站的 sn-p。

# 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,
}

编辑:

由于问题是“我的视图中需要什么?”,答案是此配置会将用户的 uid 保存为用户模型上的用户名字段,因此在您的视图中,您需要

uid = request.user.username

希望这能让你启动并运行。

【讨论】:

  • 问题是:“我的观点需要什么?”
  • 感谢您的更新。但是,跟踪 request.user.username 给了我安装 Django 时使用的管理员帐户。我不确定这本身是否是一个新问题,但是如何针对我的 LDAP 服务器对 Django 管理员进行身份验证。注意,从控制台,我可以查询我的服务器等。我只是不知道如何将整个东西集成到 Django 中。
  • 我发布的代码将验证与 LDAP 中的 UID 具有相同用户名的用户。它不会触及在系统之间不匹配的用户(例如您的默认超级用户)。如果您以 django 中不存在的不同 LDAP 用户身份登录,将为他们创建一个新的用户对象,用户名 = UID,然后您可以通过request.user.username 访问。如果您需要确定 django 用户确实是 ldap 用户,您应该使用 UID=username 查询 ldap 并查看返回的结果。
  • 其实我的LDAP服务器没有使用UID。我看到了 sAMAccountName。除了配置 settings.py,我还有一个简单的 login.html,它有一个用户名/密码表单。当我按下发送时,我想用我的 ldap 服务器验证数据。我可以从 shell 中执行此操作,并在视图中手动执行。但是,如果我在视图中进行手动初始化,我不会使用 Django 的 django_auth_ldap。网上没有这方面的例子。我能做什么?
【解决方案2】:

由于 django-auth-ldap 是一个普通的 Django 身份验证后端,request.user 应该设置为经过身份验证的用户(假设您安装了标准中间件 - 请参阅 Django 文档)。在典型设置中,request.user.username 将是用户 DN 的 uid。如果您需要更多信息,可以从request.user.ldap_user获取。

【讨论】:

    【解决方案3】:

    我没有使用 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 --<pjl@hpc.com.py>
    # 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()
    

    【讨论】:

      猜你喜欢
      • 2021-04-26
      • 1970-01-01
      • 2014-02-07
      • 2017-06-03
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      相关资源
      最近更新 更多