django--authenticate身份验证

authenticate

1.authenticate是Django内置的身份验证函数,用于验证用户的身份信息,包括用户名和密码。接收两个参数:username和password。它会将这些信息与系统中已存在的用户进行比较。如果该用户存在并且提供的密码正确,则该函数将返回一个表示该用户的对象,否则返回None。
2.在该示例中,authenticate()函数被用于验证用户输入的用户名和密码是否匹配系统中的用户,如果匹配成功,则该用户将被认为已经通过身份验证。

3.如果用户通过了身份验证,login()函数将被调用以登录该用户,将该用户的信息存储在请求(request)对象中,以便以后的访问中可以使用该信息。

4.需要注意的是,使用authenticate()进行身份验证时,需要确保Django的身份验证系统已经配置正确,包括正确的用户模型和认证后端

认证后端

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进行身份验证。

示例:

AUTHENTICATION_BACKENDS = [    'django.contrib.auth.backends.ModelBackend',    'myapp.backends.MyLDAPBackend',]

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

登录视图:

def my_login(request):
    if request.method == "POST":
        login_form = users_form.UserForm(request.POST)
        message = "请检查填写的内容!"
        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)
            try:
                if myuser.password == hash_code(password):
                    # 设置session
                    request.session['is_login'] = True
                    request.session['user_id'] = myuser.id
                    request.session['user_name'] = myuser.name
                    # 设置重定向的URL
                    next_url = request.GET.get('next', None)
                    if next_url:
                        request.session['next_url'] = next_url
                    else:
                        request.session['next_url'] = reverse('book_list')
                    print("Next URL: %s request.user:%s user:%s request.session:%s" % (
                        request.session['next_url'],
                        request.user.__dict__, myuser,
                        request.session.keys()))
                    return redirect(request.session['next_url'])
                else:
                    message = "密码不正确!"
            except:
                message = "用户不存在!"
        return render(request, 'users/login.html', locals())
    login_form = users_form.UserForm()
    return render(request, 'users/login.html', locals())

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

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

你可能感兴趣的:(django,django,python,后端)