【问题标题】:Can you use two different custom user as auth user in Django?您可以在 Django 中使用两个不同的自定义用户作为身份验证用户吗?
【发布时间】:2018-03-18 10:34:10
【问题描述】:

假设我想验证两个不同的用户(例如,学生使用其 studentID,教师使用其teacherID)。假设两者都有不同的 ID 模式。

我应该如何使用自定义用户来做到这一点?我应该从 AbsractBaseUser 扩展并在同一个班级中为他们俩使用 BaseUserManager 还是为每个学生和老师制作不同的班级?

如果是这样,我应该如何处理 settings.py 中的 AUTH_USER_MODEL ?

我可以写成“AUTH_USER_MODEL = ('accounts.StudentAccount', 'accounts.TeacherAccount') 吗?

感谢您的任何帮助和回答!!!

【问题讨论】:

    标签: python django django-users


    【解决方案1】:

    我想你可能把事情复杂化了。

    要对用户进行身份验证,您需要从他们那里获得两条信息 - 一条是公开的(如他们的用户名),另一条是私人的,即他们的密码。

    一旦您对用户进行了身份验证 - 确认他们就是他们所说的身份,也就是说,他们已经提交了有效的凭据,下一步就是弄清楚他们被授权做什么。

    总是有两个不同的步骤 - 身份验证和授权。身份验证确认你是谁,授权决定你能做什么。

    现在,在您的场景中,学生和教师正在登录。学生和教师之间的区别(除了具有不同的 id 模式)是他们可以在系统上做不同的事情。

    所以问题在于确保您向用户提供了正确的授权

    他们验证的方式真的不重要。换句话说,不管学生是用他们的电子邮件地址登录还是教师是用他们的teacherid登录,最终的身份验证过程都是一样的。

    现在,让我们进入 Django。默认情况下,在 Django 中,用户应该输入用户名。这可以是任何东西,只要它遵循两个规则:

    1. 最大长度为 150 个字符
    2. 只能包含字母数字、_、@、+、。和 - 字符

    我们需要自定义这部分吗?不是真的,因为 studentid 和teacherid 都符合这些限制。

    下一部分是如何区分“学生”和“老师”?最简单的方法是 extend the user model 通过添加自定义标志来区分教师和学生:

    from django.contrib.auth.models import User
    
    class UserType(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        flag = models.IntegerField(choices=((1, 'Student'),(2, 'Teacher')), default=1)
    

    现在,当您创建用户时 - 只需将此标志设置为 1 或 2,具体取决于您要创建的用户类型。

    请记住,身份验证不会改变 - 只是授权。

    然后您可以使用此标志来进一步限制此用户可以执行的操作。查看documentation 中的一些示例。

    【讨论】:

    • 或者我可以使用 django 中的组功能来区分该帐户属于学生组和该帐户属于教师组吗?如果是,我该怎么做?我必须通过管理页面手动完成吗?顺便说一句,感谢您的建议:D
    • 如果您不想将任何其他信息存储为用户个人资料的一部分,您可以使用群组。如果学生和老师之间没有区别(除了他们可以在系统中做什么),那么您可以使用组和开箱即用的用户模型而无需修改。
    • 我明白了...,然后我决定只使用 AbstractUser 类,并且只添加标志来区分两个用户。感谢您的回复,祝您有愉快的一天
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    相关资源
    最近更新 更多