【问题标题】:Django_auth_ldap: User from LDAP post_save signal 'created' flag always falseDjango_auth_ldap:来自 LDAP post_save 信号的用户“已创建”标志始终为假
【发布时间】:2019-10-02 13:16:47
【问题描述】:

我正在尝试允许 LDAP 用户登录到我的 Django 应用程序。每个用户都需要一些我想存储在用户配置文件模型中的附加属性。

我已经实现了 'post_save' 信号以在初始登录时创建用户配置文件,但是,我发现对于 LDAP 用户,即使他们以前从未登录过,创建的标志始终为 False。

created = True 唯一一次是我使用 manage.py 创建一个新的超级用户

我的 post_save 看起来像这样:

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    print(sender)
    print("USERPROFILE1: {0} with id {1}".format(instance, instance.pk))
    print("CREATION: {0}".format(created))
    if created:
        print("USERPROFILE3")
        UserProfile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    print("USERPROFILE2")
    instance.userprofile.save()

第一次登录时,配置文件永远不会被创建,因为“created”总是“False”

<class 'django.contrib.auth.models.User'>
USERPROFILE1: lbird with id 1
CREATION: False
User has no userprofile. while authenticating
[...]
django.contrib.auth.models.User.userprofile.RelatedObjectDoesNotExist: User has no userprofile.

【问题讨论】:

  • loginUser没有创建,然后他登录,所以用户已经存在。
  • 但是创建了一个数据库记录不构成“创建”吗?您对我如何在 LDAP 用户登录时创建此配置文件对象有什么建议吗?
  • 但在这里看起来User 记录已经创建。 User 不会在登录/注销时创建/删除。看起来您的 LDAP 系统已经“主动”构建了用户,或者您可能没有为 User 模型使用数据库?
  • 在我登录之前用户对象不存在。LDAP 获取了我的用户属性并创建了数据库记录。在我登录之前,该用户从未存在于 Django 中。

标签: django python-3.x django-authentication django-signals django-auth-ldap


【解决方案1】:

It looks like django-auth-ldap 正在使用自己的信号来创建用户,这需要一个接收器函数来在用户首次登录时填充用户配置文件模型。

This post 有一个对我有用的解决方案!确保将信号放在他们自己的 signals.py 文件中,配置 apps.py 等,但是当新的或现有的 ldap 用户登录时,此方法可以创建和/或填充用户配置文件模型。

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 1970-01-01
    • 2017-05-12
    • 2013-08-05
    • 2021-05-10
    • 2021-11-05
    • 2019-06-12
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多