django登录认证

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传过去就可以了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值