代码之家  ›  专栏  ›  技术社区  ›  bakar

Django身份验证,使用电子邮件id作为唯一密钥的自定义用户模型

  •  2
  • bakar  · 技术社区  · 11 年前

    为了实现对电子邮件id的唯一约束(不重复默认用户模型字段),我这样做了

    from django.contrib.auth.models import AbstractUser
    class User(AbstractUser):
        # some extra fields
        class Meta:
            unique_together = ('email', )
    

    然后在设置文件中 AUTH_USER_MODEL = 'myApp.User'

    mysql表将两列(用户名和电子邮件)都显示为UNI键。

    到目前为止看起来还不错,但当涉及到身份验证时,我不确定我在哪里出错。但它不起作用

    当用户名是唯一密钥并且我们通过用户名而不是电子邮件登录时,该代码就可以工作了。

    任何帮助/线索将不胜感激。

    编辑:我是否必须编写自定义模型后端(在这里解释 http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/ ) 但不知道怎么做,我在这里看到了很多代码 https://github.com/django/django/blob/master/django/contrib/auth/ init .py

    1 回复  |  直到 11 年前
        1
  •  2
  •   Rajesh Kaushik    11 年前

    你需要定义后端。py像这样:

    from django.contrib.auth.models import User, check_password
    
    class EmailAuthBackend(object):
    """
    Email Authentication Backend
    
    Allows a user to sign in using an email/password pair rather than
    a username/password pair.
    """
    
    def authenticate(self, username=None, password=None):
        """ Authenticate a user based on email address as the user name. """
        try:
            user = User.objects.get(email=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None 
    
    def get_user(self, user_id):
        """ Get a User object from the user_id. """
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None
    

    在设置文件中添加以下内容:

    AUTHENTICATION_BACKENDS = ('backends.EmailAuthBackend',)
    

    这将启用电子邮件登录。

    有关详细信息,请访问 this .