自定义用户认证系统之 authenticate

  • 当一个 User 模型对象带有用户名和密码时,且需要有别于 Django 默认的认证功能,比如用邮箱登录时,能够扩展 默认的 User 模型,或实现 一个完全定制的模型。 指定认证后端 在底层,Django 维护一个“认证后台”的列表。当调用django.contrib.auth.authenticate() 时 —— 如何登入一个用户 中所描述的 —— Django 会尝试所有的认证后台进行认证。如果第一个认证方法失败,Django 将尝试第二个,以此类推,直至试完所有的认证后台。使用的认证后台通过AUTHENTICATION_BACKENDS 设置指定。它应该是一个包含Python 路径名称的元组,它们指向的Python 类知道如何进行验证。这些类可以位于Python 路径上任何地方。
  • 默认情况下,AUTHENTICATION_BACKENDS 设置为:('django.contrib.auth.backends.ModelBackend',)
  • 这个基本的认证后台会检查Django 的用户数据库并查询内建的权限。它不会通过任何的速率限制机制防护暴力破解。你可以在自定义的认证后端中实现自己的速率控制机制,或者使用大部分Web 服务器提供的机制。
  • AUTHENTICATION_BACKENDS 的顺序很重要,所以如果用户名和密码在多个后台中都是合法的,Django 将在第一个匹配成功后停止处理。如果后台引发PermissionDenied 异常,认证将立即失败。Django 不会检查后面的认证后台。
  • 注意: 一旦用户被认证过,Django会在用户的session中存储他使用的认证后端,然后在session有效期中一直会为该用户提供此后端认证。这种高效意味着验证源被缓存基于per-session基础, 所以如果你改变 AUTHENTICATION_BACKENDS, 如果你需要迫使用户重新认证,需要清除掉 session 数据,一个简单的方式是使用这个方法: Session.objects.all().delete()。
  • 代码如下
# user/views.py
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from .models import UserProfile
class CustomBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = UserProfile.objects.get(
                Q(username=username) | Q(email=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return e

#settings.py 覆盖原来的('django.contrib.auth.backends.ModelBackend',)
AUTHENTICATION_BACKENDS=(
    "user.views.CustomBackend",
)

Django自定义用户认证系统之自定义用户模型

你可能感兴趣的:(Django)