Django用户个人资料...无需密码

4
我希望创建一个用户的子集,这些用户没有登录...基本上是为了在照片中添加摄影师字段,而不必关联一个完整的帐户(因为在许多情况下,他们实际上永远不会登录到该站点)。但需要注意的是,我也希望稍后能够为他们启用帐户。
所以,我的问题是如何最好地设置一个“People”表,它与用户表相关联,而不实际扩展用户表与UserProfile。
7个回答

8
一个用户资料 (由django.contrib.auth.models.User.get_profile返回)不会扩展User表 - 你用AUTH_PROFILE_MODULE设置指定的资料模型只是一个模型,其中包含对User的ForeignKey。 get_profile和这个设置实际上只是一个方便的API,用于访问具有特定User实例的ForeignKey的特定模型的实例。
因此,一种选择是创建一个资料模型,其中对User的ForeignKey可以为null,并将您的Photo模型与此资料模型关联,而不是与User模型关联。这将允许您为不存在的用户创建档案,并在以后的日期将注册用户附加到档案中。

为什么不在照片模型上放置外键,而是只为具有“外键(用户,null=True)”的目的创建此配置文件模型呢? - mklauber

3

无法登录的用户?只需给他们一个完全随机的密码。

import random
user.set_password( str(random.random()) )

他们永远无法登录。


为什么是-1?它看起来是一个有效的答案。 - Jorge Leitao
1
可能是因为这种方法只生成了大约一万亿个不同的密码组合,熵值非常低。这并不是一个非常高的值,特别是如果其他某些东西出现问题,比如说某些东西使用sha256作为密码哈希器,或者使用PBKDF2的迭代次数过低。 - CrazyCasta

3

提供自己的身份验证程序,然后您可以检查(或不检查)任何您喜欢的内容。我们这样做是为了如果他们在普通用户名上失败,我们也可以让他们使用电子邮件/密码登录(尽管下面我展示的不是这个)。

在settings.py中:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'userprofile.my_authenticate.MyLoginBackend', # if they fail the normal test
 )

在userprofile/my_authenticate.py文件中:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

class MyLoginBackend(ModelBackend):
    """Return User record if username + (some test) is valid.
       Return None if no match.
    """

    def authenticate(self, username=None, password=None, request=None):
        try:
            user = User.objects.get(username=username)
            # plus any other test of User/UserProfile, etc.
            return user # indicates success
        except User.DoesNotExist:
            return None
    # authenticate
# class MyLoginBackend

0

Django认证的文档中可以得知,如果您想使用用户模型,则必须拥有用户名和密码,没有“匿名账户”。我猜您可以创建一个默认密码的账户,然后让人们有机会启用“真实”的账户(通过自己设置密码)。

要设置与用户表相关联的“People”表,您只需使用ForeignKey字段(这实际上是添加其他信息到用户模型的推荐方式,而不是继承)


0

使用一个具有ForeignKey字段链接到User的模型可能不会按照您希望的方式工作,因为您需要匿名访问。我不确定那是否会起作用,但您可以尝试一下,看看如果您让它具有对AnonymousUser(其id始终为None!)的ForeignKey会发生什么。

如果您尝试了,请在此处发布您的结果,我会很好奇的。


0

django.contrib.auth.models.User 的存在仅用于使用默认的身份验证后端(基于数据库)。如果您编写自己的后端,可以使一些帐户无需密码,同时保留具有密码的普通帐户。Django 文档中有一个章节介绍了这个问题。


0

insin的回答再次点赞:通过UserProfile来处理这个问题。James Bennett有一篇很棒的文章,介绍了如何扩展django.contrib.auth.models.User。他讲解了几种方法,解释了它们的优缺点,并最终确定了使用UserProfile的方式是最理想的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接