【问题标题】:Django same username in different organizations不同组织中的Django相同的用户名
【发布时间】:2021-04-04 19:37:49
【问题描述】:

我正在使用 Django rest 构建一个 API,我正在处理一种情况,我必须使用相同的用户名但在不同的组织中验证用户,我不知道该怎么做,有什么建议吗?我将不胜感激。

用户模型:

class User(AbstractUser):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    email = models.EmailField(_('email address'), unique=True)
    phone_number = models.CharField(max_length=191, blank=True, null=True)
    roles = models.ManyToManyField(to=Role,db_column="nom",blank=True)
    objects = CustomUserManager()
    multiple_connections = models.BooleanField(default=True)
    organization = models.ForeignKey(
         to=Organizations,on_delete=models.CASCADE,to_field="organization_key", blank=True, null=True)

    def __str__(self):
        return self.username
    class Meta:
        db_table = 'users'
        verbose_name_plural = "Users"
        unique_together = ('useranme', 'organization',)


【问题讨论】:

  • 您在unique_together = ('useranme', 'organization',) 中有错字,电话号码的 191 个字符似乎有点偏大:p...无论如何...您是否考虑过使用电子邮件地址作为登录?
  • 是的,你是对的..,登录时,我必须使用用户名,这是项目规范
  • 嗯...它是一个用户名...它恰好看起来像一个电子邮件地址?我想你必须做一些事情,比如接受something/org_id 或类似的用户名......从用户体验的角度来看,这可能只是令人困惑......因为你的电子邮件列是独一无二的 - 这似乎是最简单的有道理...

标签: django django-models django-rest-framework


【解决方案1】:

我能想到两种方法:您需要让用户将他们的组织指定为您的身份验证 API 端点的参数之一,或者为来自不同组织的用户提供不同的身份验证 API 端点。

如果你走第一条路线,你可能会让每个人都 POST/my_api/auth/,并发送一个有效载荷,如:

{
    'username': 'Jim123',
    'password': 'password123456!',
    'organization_id': 7
}

如果您走第二条路线,您将拥有多个端点,例如 /my_api/organization_a/auth/my_api/organization_b/auth/ 等。

在这两种情况下,您都必须让您的服务器端身份验证代码确保它将用户名/密码与正确组织中的用户进行比较(假设该组织存储在您的数据库中的某个位置)。

【讨论】:

  • 问题不在于路由,问题在于模型实例,我收到错误,因为用户名是主键(具有该用户名的用户已经存在)
  • 从一开始就知道准确的错误消息会很有帮助。 :) 如果这是您的问题,那么所有用户都存储在同一个表中,您需要这样做,以便仅用户名不是主键。在理想情况下,您将使用usernameorganization_id 的组合作为复合主键,但Django 在数据库级别不支持它。所以我建议使用标准的id 作为主键,并使用unique_togetherusernameorganization_id 来强制唯一性。
  • 我更新了我的问题并添加了我的用户模型,因此我可以使用相同的用户名创建多个用户??如何验证它们??
  • 因此,使用该模型,是的,您可以使用相同的用户名创建多个用户,前提是他们每个人都属于不同的组织。至于如何实际验证它们,这是一个更大的问题。我建议您阅读 Django 文档中的 Customizing authentication in Django 作为起点。
猜你喜欢
  • 1970-01-01
  • 2018-02-09
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多