django1.8 自定义认证 使用邮箱 用户名登录


web应用中,用户登录的时候一般使用用户名和密码进行登录

但如果希望使用用户名或者邮箱都进行登录应该怎么处理呢?其实也很简单,定制使用authentication backend就可以了

settings.py文件的参数AUTHENTICATION_BACKENDS包含了django将会认证的所有backend,AUTHENTICATION_BACKENDS的默认值是'django.contrib.auth.backends.ModelBackend',默认使用django.contrib.auth认证。

为了能兼容用户名或者邮箱进行登录,我们为AUTHENTICATION_BACKENDS增加一个认证后端就可以了,因为django会对AUTHENTICATION_BACKENDS所有的认证后端进行认证,直到认证成功为止。

解决方法如下:

1.编写认证后端

在你的用户认证应用下新建一个文件(假设该应用为myuser_auth),命名为 myauth.py

myauth.py的代码如下:

from django.contrib.auth.models import User

class EmailAuthBackend(object):

    def authenticate(self, username=None, password=None):
        try:
            user = User.objects.get(email=username)
            if user.check_password(password):
                return user
            return None
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

2.在setting.py文件添加自定义的后端

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'myuser_auth.myauthentication.EmailAuthBackend',
)

处理以上两步就可以了,其他地方不用改动

认证的时候,django会默认对用户名密码进行认证,认证失败的话,会继续会邮箱密码进行认证,从而实现了兼容两种方式的登录。

暂无评论

注册用户登录后才能发表或者回复评论,请先登录 注册。