python - 如何在 Django 中创建仅包含用户名的用户模型?

标签 python django rest authentication django-rest-framework

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

我想根据随机哈希创建用户,我将使用 uuid 来做到这一点。最重要的是,我不需要用户名密码电子邮件全名(?)。这种类型的用户将通过 View 上的 GET 参数进行身份验证,仅使用其用户名,而不使用其他任何内容。

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

进一步说明

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

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

  1. 匿名用户:向服务器请求某些数据的用户
  2. uuid 用户:拥有唯一 ID 的用户。为什么我需要这种类型?因为我想跟踪这些用户的请求并为他们响应特殊数据。如果此类用户在特定几天内不活动,也会被删除。我想我可以通过 cron jobs 来完成。
  3. admin:这是我,正在访问管理面板。仅此而已。

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

<小时/>

环境

  • Django 1.9.5
  • python 3.5.1

最佳答案

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

所以,在我的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 是否存在于数据库中,并在从 View 调用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/

关于python - 如何在 Django 中创建仅包含用户名的用户模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36585015/

相关文章:

python - 如何在 Python Pandas 中重命名索引行?

jquery 复选框警报

python - 在 django admin 中动态设置 readonly_fields

angularjs - Angular 和 CORS

java - 从API读取JSON数据

python - 在 Python 中通过 ElementTree 解析 xml 时如何保留命名空间

python - 如何使用 2 因素身份验证从 python 发送电子邮件?

python - 用 pyplot 画一个圆

c# - Grapevine REST 服务器,我无法从其他具有 IP 或主机名的 PC 访问

python - django 1.8 - 'NoneType' 对象没有属性 'aggregate'