python - 如何让 django-ldapdb 将数据源识别为 LDAP

标签 python django ldap

我已按照 django-ldap README 中的说明进行操作我似乎无法让 django-ldapdb 表现得像进行 LDAP 查询一样。以下内容已在使用 Python 3.7 的 Django v.2.1.2 全新实例上进行了编辑:

settings.py的更改:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'ldap': {
        'ENGINE': 'ldapdb.backends.ldap',
        'NAME': 'ldaps://my.server',
        'USER': 'cn=some user',
        'PASSWORD': 'somePassword',
    }
}
DATABASE_ROUTERS = ['ldapdb.router.Router']

models.py:

class MyPerson(ldapdb.models.Model):
        base_dn = "ou=people,dc=ucsf,dc=edu"
        object_classes = ['person', 'myPerson]

        uid = fields.IntegerField(db_column='uid')
        displayname = fields.CharField(db_column='displayname')
        eid = fields.CharField(db_column='eid')

        def __str__(self):
            return str(self.uid)

        def _unicode__(self):
            return str(self.uid)

我认为的查询。我首先尝试:

result = MyPerson.objects.filter(uid=99894)

然后我尝试了:

result = MyPerson.objects.using('ldap').filter(uid=99894)

在 PyCharm 的调试器中运行 Django 开发服务器,我可以看到 result 收到一个 QuerySet ,其中包含以下消息:

Unable to get repr for <class 'django.db.models.query.QuerySet'>

“消息”是什么意思?老实说,我不确定,但调试器显示了这一点:

enter image description here

此外,虽然 QuerySetdb 成员是“ldap”,并且 query 成员显示 SQL 查询,不是 LDAP 过滤器。当我通过 URL 路由跟踪 HTTP 请求、到 View 、到查询、然后到结果时,我从未见过它进行任何类型的 LDAP 相关调用。为了更好地衡量,我破坏了 LDAP 绑定(bind)密码,但没有收到绑定(bind)错误。很确定我错过了一些让 Django 知道我现在想使用 LDAP 的东西...我只是不知道那是什么。

最佳答案

由于 LDAP 不代表关系数据库,并且通常具有通过配置而不是查询创建的架构,因此我从来没有意识到我需要运行 manage.py makemigrationsmanage.py迁移。 (我对 Python 比较陌生,对 Django 更陌生。我过去为 LDAP 使用和扩展的多数据源 ORM 不需要类似的准备工作。)凭直觉,我运行了 manage .py 对我的 LDAP 模型执行命令,然后再次尝试我的代码。现在可以了。

FWIW - 我使用 PHP Symfony 工作了几年并创作了 ucsf-iam/UcsfLdapOrm。虽然 Symfony 也有一个数据库迁移过程,但由于 LDAP 模式相当静态,当我编写 LDAP ORM 时,我对 Django 迁移动态处理的部分内容进行了硬编码。其余的由模型类中的 PHP 注释处理,类似于 Django 如何具有 pythonic 字段类型并将它们与 LDAP 属性类型相关联。现在我更好地理解了这一切,我对 Django 如何进行 ORM 设置有了更深入的了解。

我希望这对其他转向 Python 和 Django 的 LDAP 开发人员有指导作用。

关于python - 如何让 django-ldapdb 将数据源识别为 LDAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53291103/

相关文章:

python - openshift:无法为 python 应用程序安装 lxml

python - 根据元组列表对元组列表进行排序 - Python

python - Ubuntu 导入错误 : Could not import settings (works on Mac)

python - 从上传的文件创建 OleFile 类型的文件

active-directory - Active Directory 中 'country' 字段的值是什么?

python - 在 Django 中收集来自第三方应用程序的消息

python - *nix 系统中 python 中的自重启守护进程

python - Django 2、python 3.4 无法解码 urlsafe_base64_decode(uidb64)

tomcat - 通过 Tomcat 进行 Spring Boot LDAP 身份验证(预身份验证)

php - 您如何根据本地 Active Directory 验证云服务?