Django认证系统的组成部分包括:User,Permission,Group
在暗中,Django维护一个”authentication backends”的列表用来测试认证。当某人调用 django.contrib.auth.authenticate() — 上面提到的”如何登录一个用户” — Django将尝试所有的认证后端。如果第一个认证方法失败了,Django将会继续尝试第二个,直到所有的都被尝试过。
(‘django.contrib.auth.backends.ModelBackend’,)
这是检测Django用户数据库的基本认证方案。
一个认证后端是一个类,实现了2个方法:get_user(id) 和 authenticate(**credentials) 。
get_user 方法接受一个 id — 可以是用户名,数据库ID或者其他的什么 — 并且返回一个 User 对象。
authenticate方法接受字典类型认证信息的参数。
class MyBackend:
def authenticate(username=None, password=None):
# 检测一个用户名和密码,然后返回一个User对象
当 authenticate 接受的参数被验证为有效的时候,应该返回一个 User 对象;如果无效的时候,应该返回 None 。
在settings中有关用户认证的默认设置:
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend', # default
'oauth2_provider.backends.OAuth2Backend',
)
现在用户的基本信息拓展为含有手机号,而且手机号是唯一的,现实现用户可以通过手机号实现登录认证。在原来的认证之前通过手机号定位用户,然后再使用该用户名和输入的密码进行验证。
代码实现如下:
from django.contrib import auth
from oauth2_provider import backends
class ModelBackend(auth.backend):
def authenticate(self, request, username=None, password=None, **kwargs):
user = None
if username:
user = super().authenticate(request, username, password, **kwargs)
if not user:
username = User.objects.get(phone=username).username
user = super().authenticate(request, username, password, **kwargs)
return user
可以通过用户名密码,也可以通过手机号密码进行登录认证。若可以查到用户就返回该用户,否则返回None。
在上面的代码中,可以通过print查看,reques is None,以下为修改方案:
在validate_user方法中,u = authenticate(request, username=username, password=password)调用的时候将request传过去就可以了。