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

时间:2016-04-12 22:14:46

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

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

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

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

进一步说明

现在,我可以听到诸如“为什么任何人都需要特别无密码的用户模型,特别是认为它非常不安全”之类的问题。因此,这部分特别针对那些需要逻辑解释来理解这种请求的人。

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

  1. anonymous users:那些在服务器上请求某些数据的人
  2. uuid users:拥有唯一ID的人。为什么我需要这种类型?因为我想跟踪这些用户的请求并为他们响应特殊数据。如果这些用户在特定的几天内处于非活动状态,也会被删除。我想我可以通过cron jobs来做到这一点。
  3. admin:这是我,请联系管理员小组。就是这样。
  4. 我认为这足以解释。

    环境

    • django 1.9.5
    • python 3.5.1

1 个答案:

答案 0 :(得分: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,并在从视图中调用authenticate()时返回true。

在settings.py文件中添加身份验证后端:

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

创建一个文件app_name / auth.py,其内容为SIMILAR,如下所示:

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/