django authenticate用户身份认证的项目实践

 更新时间:2023年08月10日 11:50:38   作者:liulanba  
Django的contrib.auth模块中的authenticate()函数用于对用户的凭据进行身份验证,本文就来介绍一下django authenticate用户身份认证的使用,具有一定的参考价值,感兴趣的可以了解一下

authenticate

Django的contrib.auth模块中的authenticate()函数用于对用户的凭据进行身份验证,与已配置的身份验证后端进行比较。

当用户尝试登录时,authenticate()函数将使用用户的凭据(即用户名和密码)作为参数进行调用,该函数然后检查可用的身份验证后端以验证凭据,这些后端在项目的settings.py文件中定义,如果凭据有效,则authenticate()函数返回已认证的用户对象;否则,它返回None。
在成功身份验证后,可以使用Django的login()函数登录用户。

认证后端

1.AUTHENTICATION_BACKENDS是Django设置中的一个参数,它定义了用于身份验证的后端认证方式。这个参数是一个字符串列表,包含Django认证系统使用的认证后端类的全名。

2.当用户尝试进行身份验证时,Django将按照AUTHENTICATION_BACKENDS中定义的顺序,尝试每个后端认证方式,直到找到一个认证方式成功为止。如果所有后端认证方式都失败,则身份验证失败。

3.默认情况下,Django使用ModelBackend作为身份验证后端,它基于Django中的用户模型进行身份验证。除此之外,Django还提供了其他的身份验证后端,如LDAPBackend、RemoteUserBackend等,也可以自定义身份验证后端。

4.通过配置AUTHENTICATION_BACKENDS参数,可以对身份验证后端进行定制,以满足具体项目的需求。例如,如果你的项目需要使用LDAP进行用户身份验证,则可以添加LDAPBackend到AUTHENTICATION_BACKENDS列表中,以便Django使用LDAPBackend进行身份验证。

from django.contrib.auth import authenticate
from django.contrib.auth import login as user_login
def my_login(request):
    """
    登录视图
    :param request:
    :return:
    """
    if request.method == "POST":
        login_form = users_form.UserForm(request.POST)
        if login_form.is_valid():
            username = login_form.cleaned_data['username']
            password = login_form.cleaned_data['password']
            myuser = authenticate(username=username, password=password)
            if myuser is not None:
                user_login(request, myuser)

这段代码使用Django的contrib.auth模块来进行用户身份验证和登录。
首先,它调用authenticate()函数验证用户的凭据,如果凭据有效,则authenticate()函数将返回已认证的用户对象,并将其赋给myuser变量。如果凭据无效,则authenticate()函数将返回None。
接着,代码检查myuser变量是否为None。如果myuser不为None,则说明凭据有效,并且代码将调用user_login()函数来将该用户登录到当前会话中。user_login()函数需要传递一个request对象和已认证的用户对象。登录成功后,用户可以访问需要认证的页面和视图。
如果myuser为None,则说明凭据无效,用户无法登录。

myuser 和 request.user 是两个不同的对象,其区别在于:
1.myuser 表示通过用户名和密码认证成功后得到的用户对象, 是通过表单验证之后从数据库中查询出来的用户对象,即 authenticate 方法返回的对象。主要用来检查用户输入的用户名和密码是否正确,并在认证成功后设置一些 session 变量。
2.request.user 表示当前请求的用户对象,是通过 Django 的认证系统得到的用户对象,包括通过认证的用户和未认证的用户。如果用户已通过认证,则该对象是一个 User 实例,否则是一个 AnonymousUser 实例。 主要用来获取当前认证的用户信息,例如用户的用户名、邮箱等。这些信息通常用来显示在页面上,或者用来判断当前用户是否有权限进行某些操作。

因此,在这个方法中,myuser 和 request.user 作用是相同的,都是用来判断用户是否已通过认证,但是可能是不同的对象,因为 myuser 只在用户认证成功后才会有值,而 request.user 则是在每个请求中都会有值,不论用户是否通过认证。同时,在这个方法中,myuser 和 request.user 都可以用来检查用户是否已通过认证,但是只有 request.user 才可以用来获取当前认证的用户信息。

authenticate函数如下:

@sensitive_variables("credentials")
def authenticate(request=None, **credentials):
    """
    If the given credentials are valid, return a User object.
    """
    for backend, backend_path in _get_backends(return_tuples=True):
        backend_signature = inspect.signature(backend.authenticate)
        try:
            backend_signature.bind(request, **credentials)
        except TypeError:
            # This backend doesn't accept these credentials as arguments. Try
            # the next one.
            continue
        try:
            user = backend.authenticate(request, **credentials)
        except PermissionDenied:
            # This backend says to stop in our tracks - this user should not be
            # allowed in at all.
            break
        if user is None:
            continue
        # Annotate the user object with the path of the backend.
        user.backend = backend_path
        return user

_get_backends会从settings.py中读取AUTHENTICATION_BACKENDS定义的后端路径:

def _get_backends(return_tuples=False):
    backends = []
    for backend_path in settings.AUTHENTICATION_BACKENDS:
        backend = load_backend(backend_path)
        backends.append((backend, backend_path) if return_tuples else backend)
    if not backends:
        raise ImproperlyConfigured(
            "No authentication backends have been defined. Does "
            "AUTHENTICATION_BACKENDS contain anything?"
        )
    return backends
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'backends.user_backend.UserBackend'
]

AUTHENTICATION_BACKENDS列表中包含了两个认证后端,分别是ModelBackend和UserBackend。Django将按照列表中的顺序依次尝试这两个认证后端,直到找到一个成功为止。

UserBackend需要继承BaseBackend并实现一个authenticate函数:

from django.contrib.auth.backends import BaseBackend
from users.models import MyUser
class UserBackend(BaseBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            myuser = MyUser.objects.get(name=username)
            if myuser.check_password(password):
                return myuser
        except MyUser.DoesNotExist as e:
            print("user no exist", e)
            return None
    def get_user(self, user_id):
        try:
            return MyUser.objects.get(pk=user_id)
        except MyUser.DoesNotExist:
            return None

到此这篇关于django authenticate用户身份认证的项目实践的文章就介绍到这了,更多相关django authenticate身份认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python图像运算之图像锐化和边缘检测

    Python图像运算之图像锐化和边缘检测

    这篇文章主要和大家讲解一下常见的图像锐化和边缘检测方法,即Roberts算子和Prewitt算子。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-12-12
  • Python新手入门之解释器的安装

    Python新手入门之解释器的安装

    相信有很多小伙伴还不会安装Python解释器,今天特地整理了本篇文章,文章有非常详细的图文示例,对不会安装的小伙伴很有帮助,需要的朋友可以参考下
    2021-06-06
  • tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)

    tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)

    这篇文章主要介绍了tensorflow 2.1.0 安装与实战(CASIA FACE v5),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 详解Python中常用的激活函数(Sigmoid、Tanh、ReLU等)

    详解Python中常用的激活函数(Sigmoid、Tanh、ReLU等)

    激活函数 (Activation functions) 对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用,这篇文章主要介绍了Python中常用的激活函数(Sigmoid、Tanh、ReLU等),需要的朋友可以参考下
    2023-04-04
  • Python进阶之高级用法详细总结

    Python进阶之高级用法详细总结

    今天带各位小伙伴学习一下Python高级语法,主要有Lambda表达式,map函数,filter函数,reduce函数,三大推导式等,文中有非常详细的介绍,需要的朋友可以参考下
    2021-05-05
  • 用 Python 脚本实现电脑唤醒后自动拍照并截屏发邮件通知

    用 Python 脚本实现电脑唤醒后自动拍照并截屏发邮件通知

    这篇文章主要介绍了用 Python 脚本实现电脑唤醒后自动拍照并截屏发邮件通知,文中详细的介绍了代码示例,具有一定的 参考价值,感兴趣的可以了解一下
    2023-03-03
  • python字典中get()函数的基本用法实例

    python字典中get()函数的基本用法实例

    在字典内置的方法中,想说的方法为get,这个方法是通过键来获取相应的值,但是如果相应的键不存在则返回None,这篇文章主要给大家介绍了关于python字典中get()函数的基本用法,需要的朋友可以参考下
    2022-03-03
  • Python实现多线程抓取网页功能实例详解

    Python实现多线程抓取网页功能实例详解

    这篇文章主要介绍了Python实现多线程抓取网页功能,结合具体实例形式详细分析了Python多线程编程的相关操作技巧与注意事项,并附带demo实例给出了多线程抓取网页的实现方法,需要的朋友可以参考下
    2017-06-06
  • python使用tomorrow实现多线程的例子

    python使用tomorrow实现多线程的例子

    今天小编就为大家分享一篇python使用tomorrow实现多线程的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 详解tf.device()指定tensorflow运行的GPU或CPU设备实现

    详解tf.device()指定tensorflow运行的GPU或CPU设备实现

    这篇文章主要介绍了详解tf.device()指定tensorflow运行的GPU或CPU设备实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02

最新评论