Django自定义身份认证

指定用户名或者手机号登录请求:

"认证"后端 在以下情形是可被扩展:当一个User模型对象带有用户名和密码时,且需要有别与Django默认的认证功能。

可为你的模型提供可通过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.contrib.auth.backends.ModelBackend后实现authenticate方法即可。

以多账号登录为例,通过用户名 或 手机号进行登录:

class CustomBackend(ModelBackend):
    """
    自定义用户验证
    """
    def authenticate(self, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(Q(username=username)|Q(mobile=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return None

在 settings.py中 定义

AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend',
)

转载于:https://www.cnblogs.com/zenan/p/9111123.html

发布了8 篇原创文章 · 获赞 1 · 访问量 162

猜你喜欢

转载自blog.csdn.net/weixin_43762794/article/details/102782860