Django认证流程源码及自定义 Backend
2023/5/31 18:53:35
本文主要是介绍Django认证流程源码及自定义 Backend,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Django自己的认证方法只能认证用户名和密码
user = authenticate(**credentials) # authenticate会自动校验用户名和密码
authenticate 源码
def authenticate(request=None, **credentials): """ If the given credentials are valid, return a User object. """ # _get_backends 是Django的配置文件中的AUTHENTICATION_BACKENDS 列表里面定义的认证方式 # 如果你自己项目的配置文件中配置了AUTHENTICATION_BACKENDS就会去你自己的配置文件中找 for backend, backend_path in _get_backends(return_tuples=True): backend_signature = inspect.signature(backend.authenticate) try: backend_signature.bind(request, **credentials) except TypeError: continue try: # 每循环一个backend 都会去调用authenticate方法 # 如果你自己重写了authenticate方法 就会走你自己写的 user = backend.authenticate(request, **credentials) except PermissionDenied: break if user is None: continue user.backend = backend_path return user
如果自己没有配置AUTHENTICATION_BACKENDS
# 会从Django的配置文件中找 # from django.conf import global_settings AUTH_USER_MODEL = 'auth.User' AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend']
导入django.contrib.auth.backends.ModelBackend
from django.contrib.auth.backends import ModelBackend # 源码如下 class ModelBackend(BaseBackend): """ Authenticates against settings.AUTH_USER_MODEL. """ def authenticate(self, request, username=None, password=None, **kwargs): if username is None: username = kwargs.get(UserModel.USERNAME_FIELD) if username is None or password is None: return try: # 通过自然键(USERNAME_FIELD)获取 user 对象 user = UserModel._default_manager.get_by_natural_key(username) except UserModel.DoesNotExist: UserModel().set_password(password) else: # 检查密码和是否是活跃用户,然后返回一个 user 对象,否则什么也不返回 就是 None if user.check_password(password) and self.user_can_authenticate(user): return user
自定义Backend 实现简单的认证方式,如下:
因为Django自带的authenticate只能帮你验证用户名和密码,当你需要验证使用如手机号登录、邮箱登录、验证码登录等时,需要自己重写authenticate方法,自定义认证方式
from django.contrib.auth.backends import ModelBackend # 继承ModelBackend重写里面的authenticate方法 自定义认证方式 class LoginBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): user = UserInfo.objects.get(Q(username=username) | Q(phone=username) | Q(email=username)) if user is not None and user.check_password(password): return user
最后settings.py中需要配置
AUTHENTICATION_BACKENDS = [ 'app01.backends.LoginBackend' ] # 配置完之后再走校验的话就会先从你自己写的这个类里面去执行authenticate方法 # 会用你自己的校验方式
这篇关于Django认证流程源码及自定义 Backend的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站