【问题标题】:How to Create A User Model Only Including Username in Django?如何在 Django 中创建仅包含用户名的用户模型?
【发布时间】:2016-08-03 18:13:04
【问题描述】:

嗯,这有点复杂,但让我自己解释一下。我想创建一个 RESTful 服务。此服务将包含用户,但不是以经典方式。

我想根据随机哈希创建用户,我将使用uuid 来实现。最重要的是我不需要usernamepasswordemailfull_name (?)。这种类型的用户将通过视图上的 GET 参数进行身份验证,仅使用其 username,而不使用其他任何内容。

我阅读了一些关于扩展 Django 用户的文章,但我找不到特别针对这种情况的令人满意的解释。

进一步说明

现在,我可以听到诸如“为什么有人需要特别无密码的用户模型,并且特别认为它非常不安全。”之类的问题。因此,这部分特别适合那些需要逻辑解释才能理解此类请求的人。

在服务中,我想拥有三组用户:

  1. anonymous users: 在服务器上请求一些数据的人
  2. uuid users:拥有唯一 id 的人。为什么我需要这种类型?因为我想跟踪这些用户的请求并为他们响应特殊数据。如果这些用户在特定几天内不活动,也将被删除。我想我可以通过 cron 作业来做到这一点。
  3. admin:这是我,进入管理面板。仅此而已。

我认为这已经足够解释了。


环境

  • django 1.9.5
  • python 3.5.1

【问题讨论】:

  • 不能为更少的字段扩展模型。模型继承是增量的,您没有办法,只能从头开始创建较小的模型。阅读文档和源代码以获取有关如何根据需要实现用户模型以及不同身份验证后端的帮助。
  • 好吧,我把这当成一个信息,但这并不能解决问题。所以,以防万一,我不会删除问题,等待解决方案。一定有办法做到这一点,对吧?
  • 他们会如我所说的那样回答:数据库中不能有 less 字段。 Django 为像你我这样的人提供了一个AbstractBaseUser 类。您不是第一个要求使用较小用户模型的人。以 AbstractBaseUser 为基础,或遵循 django 指南从头开始创建模型。此外,您需要为您想要实现的目标创建一个自定义身份验证后端。

标签: python django rest authentication django-rest-framework


【解决方案1】:

Django 支持多种后端身份验证。正如 Luis Masuelli 建议的那样,您可以扩展模型以添加更多字段。但在您的场景中,您特别希望实现自定义身份验证方法。我会着手将 uuid 视为用户名并将密码设置为无。

所以,在我的 settings.py 中:

 AUTH_USER_MODEL = 'app_name.MyUUIDModel'
 # REMOVE ALL PASSWORD Validators

在我的 app_name/models.py 中:

from django.contrib.auth.models import BaseUserManager

class MyUUIDManager(BaseUserManager):

def create_user(self, uuid):
    user = self.model(
        uuid=self.normalize_email(email),
    )
    user.set_password(None)
    user.save(using=self._db)
    return user

def create_superuser(self, uuid):
    user = self.create_user(uuid)
    user.save(using=self._db)
    return user

def get_by_natural_key(self, email):
    return self.get(**{self.model.USERNAME_FIELD: email})   

 class MyUUIDModel(AbstractBaseUser):
       uuid = models.CharField(max_length=36, unique=True)
       USERNAME_FIELD = 'uuid'
       objects = UUIDModelManager()
       def save(self, *args, **kwargs):
           super(MyUUIDModel, self).save(*args, **kwargs)

此时,如果您运行 createuser 或 createsuperuser Django 命令,您可能能够创建用户。下一位是需要进行身份验证的地方。您可以简单地检查 UUID 是否存在于您的数据库中,并在从视图调用 authenticate() 时返回 true。

在settings.py文件中添加认证后端:

AUTHENTICATION_BACKENDS = [
  'django.contrib.auth.backends.ModelBackend',
  'app_name.auth.MyBackend'
]

创建一个文件 app_name/auth.py,其内容类似于以下:

class MyBackend(object):
    def authenticate(self, username=None, password=None):

        # Check if username i.e. UUID exists
        try:
            my_uuid = MyUUIDModel.objects.get(uuid=username)
        except MyUUIDModel.DoesNotExist:
            return None
        return my_uuid

更多详情请参考:https://docs.djangoproject.com/en/1.9/topics/auth/customizing/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2020-09-17
    • 2019-10-17
    相关资源
    最近更新 更多