一、介绍
Django 验证系统处理验证和授权。简单来说,验证检验用户是否是他们的用户,授权决定已验证用户能做什么。这里的术语验证用于指代这两个任务。
认证系统由以下部分组成:
-
用户
-
权限:二进制(是/否)标识指定用户是否可以执行特定任务。
-
组:将标签和权限应用于多个用户的一般方法。
-
可配置的密码哈希化系统
-
为登录用户或限制内容提供表单和视图工具
-
可插拔的后端系统
1.1 项目自带了用户认证系统
在项目的最外层目录下的settings.py中的INSTALLED_APPS
中,已经安装过了auth模块和contenttypes模块。
-
‘django.contrib.auth’ 包含了验证框架的内核和它的默认模型。
-
‘django.contrib.contenttypes’ 是 Django
content type system
,允许你创建的模型和权限相关联。
还记得在admin入门一节中,在数据迁移时,安装的关于auth相关的模型吗
这些表结构就提供了Django的用户认证系统的功能支持。
二、开始使用
2.1 创建用户
创建完成后显示如下,可以进行用户的授权
这里寄给zs2023用户,只有对我们TodoApp的新增和修改的权限
授权完成后,可以看到用户信息
2.2 切换用新用户登录
并且,该用户只有对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 %}
登录后,就会出现如下信息;这里先不考虑这个,这个知识点后续会有讲解。
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的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 登录验证
用户名不存在:
密码错误:
全部正确:
五、API解释
5.1 User对象
用户对象是认证系统的核心。它通常代表了与你的站点交互的人员,并用于允许诸如限制访问、注册用户配置文件、将内容与创建者关联等功能。Django 的认证框架中用户只有一个类,例如 “超级管理员”或“普通管理员”只是具有特殊属性集的用户对象,而不是用户对象的不同类。
该对象在**django.contrib.auth.models**
下,
5.1.1 字段
字段 | 描述 |
---|---|
username | 必要的。150 个字符或以下。用户名可包含字母数字、_、@、+、. 和 – 字符。 |
first_name | 可选的(blank=True)。150 个字符或更少 |
last_name | 可选的(blank=True)。150 个字符或更少。 |
可选的(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 的格式是 “ |
has_perms(perm_list**, **obj=None) | 如果用户拥有指定的每个权限,返回 True,其中每个 perm 的格式为 “ |
原文始发于微信公众号(Python之家):Django-8-用户认证
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/198144.html