Django-8-用户认证

一、介绍

Django 验证系统处理验证和授权。简单来说,验证检验用户是否是他们的用户,授权决定已验证用户能做什么。这里的术语验证用于指代这两个任务。
认证系统由以下部分组成:

  • 用户

  • 权限:二进制(是/否)标识指定用户是否可以执行特定任务。

  • 组:将标签和权限应用于多个用户的一般方法。

  • 可配置的密码哈希化系统

  • 为登录用户或限制内容提供表单和视图工具

  • 可插拔的后端系统

1.1 项目自带了用户认证系统

在项目的最外层目录下的settings.py中的INSTALLED_APPS中,已经安装过了auth模块和contenttypes模块。

Django-8-用户认证
image.png
  1. ‘django.contrib.auth’ 包含了验证框架的内核和它的默认模型。

  2. ‘django.contrib.contenttypes’ 是 Django content type system ,允许你创建的模型和权限相关联。

还记得在admin入门一节中,在数据迁移时,安装的关于auth相关的模型吗

Django-8-用户认证
image.png


这些表结构就提供了Django的用户认证系统的功能支持。


二、开始使用

2.1 创建用户

Django-8-用户认证
image.png


创建完成后显示如下,可以进行用户的授权

Django-8-用户认证
image.png


这里寄给zs2023用户,只有对我们TodoApp的新增和修改的权限

Django-8-用户认证
image.png


授权完成后,可以看到用户信息

Django-8-用户认证
image.png

2.2 切换用新用户登录

Django-8-用户认证
image.png


并且,该用户只有对TodoApp的新增和修改权限。


三、如何在非admin中使用

3.1 创建登录页面

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="/login/" method="post">
    {% csrf_token %}
    用户名:<input type="text" name="username"/>
    <br>
    密码:<input type="password" name="password"/>
    <br>
    <button type="submit">登录</button>
</form>
</body>
</html>

上例,如果不加{% csrf_token %}登录后,就会出现如下信息;这里先不考虑这个,这个知识点后续会有讲解。

Django-8-用户认证
image.png

3.2 创建登录后成功页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    {{ username }}登录成功
</body>
</html>

3.3 在路由文件urls.py上新增路由

这里使用的是一级路由,没有使用子路由

from django.contrib import admin
from django.urls import path

from MyAdmin.views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', login)
]

3.4 登录视图函数

在MyAdmin应用下创建视图函数。
其实在哪里创建都无所谓,因为现在还未到项目阶段,所以想在何处都可以。在TodoApp处也可以。

from django.shortcuts import render


# Create your views here.

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')

    if request.method == 'POST':
        # 获取登录参数
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username, password)
        retData = {
            'username': username
        }
        return render(request, 'index.html', retData)

3.5 登录测试

这里使用刚才注册的zs2023这个账户。
现在的登录视图,还未做任何业务逻辑,只是走了一遍流程,然后把用户名跳转到index.html而已。

Django-8-用户认证
image.png

四、如何结合django的auth

4.1 修改登录视图函数

from django.contrib.auth import authenticate
from django.contrib.auth.models import User
from django.shortcuts import render


# Create your views here.

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')

    if request.method == 'POST':
        # 获取登录参数
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username, password)

        # 1. 先判断当前username是否存在
        if User.objects.filter(username=username):
            # 用户存在,开始校验密码
            user = authenticate(username=username, password=password)
            if user:
                # 存在,是否已经激活
                if user.is_active:
                    return render(request, 'index.html', {'username': username})
                else:
                    return render(request, 'login.html', {'errmsg''当前用户不可用'})
            else:
                return render(request, 'login.html', {'errmsg''密码错误'})
        else:
            # 用户名不存在
            return render(request, 'login.html', {'errmsg''用户不存在'})

4.2 修改登录页面

增加响应错误信息

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="/login/" method="post">

    {% if errmsg %}
        <h1 style="color:red;">{{ errmsg }}</h1>
    {% endif %}


    {% csrf_token %}
    用户名:<input type="text" name="username"/>
    <br>
    密码:<input type="password" name="password"/>
    <br>
    <button type="submit">登录</button>
</form>
</body>
</html>

4.3 登录验证

用户名不存在:

Django-8-用户认证
image.png


密码错误:

Django-8-用户认证
image.png


全部正确:

Django-8-用户认证
image.png

五、API解释

5.1 User对象

用户对象是认证系统的核心。它通常代表了与你的站点交互的人员,并用于允许诸如限制访问、注册用户配置文件、将内容与创建者关联等功能。Django 的认证框架中用户只有一个类,例如 “超级管理员”或“普通管理员”只是具有特殊属性集的用户对象,而不是用户对象的不同类。
该对象在**django.contrib.auth.models**下,

5.1.1 字段

字段 描述
username 必要的。150 个字符或以下。用户名可包含字母数字、_@+. 字符。
first_name 可选的(blank=True)。150 个字符或更少
last_name 可选的(blank=True)。150 个字符或更少。
email 可选的(blank=True)。电子邮件地址。
password 需要。一个密码的哈希值和元数据。(Django 不存储原始密码。)原始密码可以任意长,可以包含任何字符
groups 多对多关系到 Group
is_staff 布尔型。指定该用户是否可以访问管理站点。
is_active 布尔值。指定该用户账户是否应该被视为活跃账户。我们建议你把这个标志设置为 False,而不是删除账户;这样,如果你的应用程序对用户有任何外键,外键就不会被破坏。
is_superuser 布尔值。指定该用户拥有所有权限,而不用一个个开启权限。
last_login 用户最后一次登录的日期时间。
date_joined 指定账户创建时间的日期时间。帐户创建时,默认设置为当前日期/时间

5.1.2 属性

属性 描述
is_authenticated 只读属性,始终返回 True (匿名用户 AnonymousUser.is_authenticated 始终返回 False )。这是一种判断用户是否已通过身份认证的方法。这并不意味着任何权限,也不会检查用户是否处于活动状态或是否具有有效会话。即使通常你会根据 request.user 检查这个属性,以确定它是否被 AuthenticationMiddleware 填充(表示当前登录的用户),但是你应该知道该属性对于任何 User 实例都返回 True
is_anonymous 只读属性,总是 False。这是区分 User 和 AnonymousUser 对象的一种方式。一般来说,你应该优先使用 is_authenticated 来代替这个属性。

5.1.3 方法

方法 描述
get_username() 返回用户的用户名。由于 User 模型可以被替换,你应该使用这个方法而不是直接引用用户名属性。
get_full_name() 返回 first_name 加上 last_name,中间有一个空格。
get_short_name() 返回 first_name
set_password(raw_password) 将用户的密码设置为给定的原始字符串,并进行密码哈希处理。不保存 User 对象。
check_password(raw_password) 如果给定的原始字符串是用户的正确密码,返回 True。(密码哈希值用于比较)
get_user_permissions(obj=None) 返回用户直接拥有的一组权限字符串。如果传入了 obj,则只返回这个特定对象的用户权限。
get_group_permissions(obj=None) 返回用户通过他们的组拥有的一组权限字符串。如果传入了 obj,则只返回这个特定对象的组权限。
get_all_permissions(obj=None) 返回用户拥有的一组权限字符串,包括通过组和用户的权限。如果传入了 obj,则只返回这个特定对象的权限。
has_perm(perm, obj=None) 如果用户拥有指定的权限,返回 True,其中 perm 的格式是 .。(参见 权限 的文档)。如果用户是不活跃的,这个方法将总是返回 False。对于活跃的超级用户,本方法将始终返回 True如果传入了 obj,这个方法不会检查模型的权限,而是检查这个特定对象的权限
has_perms(perm_list**, **obj=None) 如果用户拥有指定的每个权限,返回 True,其中每个 perm 的格式为 .。如果用户不活跃,本方法将总是返回 False。对于活跃的超级用户,本方法将始终返回 True如果传入了 obj,这个方法不会检查模型的权限,而是检查这个特定对象的权限。


原文始发于微信公众号(Python之家):Django-8-用户认证

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/198144.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!