嗯,这有点复杂,但让我解释一下自己。我想创建一个RESTful服务。此服务将包含用户,但不是以经典方式。
我想基于随机哈希创建用户,我将使用uuid
来做到这一点。最重要的是我不需要username
,password
,email
或full_name
(?)。此类用户将通过视图上的GET参数进行身份验证,仅使用其username
,而不是其他任何内容。
我在扩展Django用户上阅读了一些文章,但我找不到令人满意的解释,特别是对于这种情况。
现在,我可以听到诸如“为什么任何人都需要特别无密码的用户模型,特别是认为它非常不安全”之类的问题。因此,这部分特别针对那些需要逻辑解释来理解这种请求的人。
在服务中,我希望有三组用户:
anonymous users
:那些在服务器上请求某些数据的人uuid users
:拥有唯一ID的人。为什么我需要这种类型?因为我想跟踪这些用户的请求并为他们响应特殊数据。如果这些用户在特定的几天内处于非活动状态,也会被删除。我想我可以通过cron jobs来做到这一点。admin
:这是我,请联系管理员小组。就是这样。我认为这足以解释。
答案 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/