Django学习笔记-默认的用户认证系统(auth)
一、Django默认的用户认证系统
Django 自带一个用户验证系统。它负责处理用户账号、组、权限和基于cookie的用户会话。
Django 验证系统处理验证和授权。简单来说,验证检验用户是否是他们的用户,授权决定已验证用户能做什么。这里的术语验证用于指代这两个任务。
认证系统由以下部分组成:
- 用户
- 权限:二进制(是/否)标识指定用户是否可以执行特定任务。
- 组:将标签和权限应用于多个用户的一般方法。
- 可配置的密码哈希化系统
- 为登录用户或限制内容提供表单和视图工具
- 可插拔的后端系统
Django 里的验证系统旨在通用化,不提供一些常见的 web 验证系统的特性。其中一些常见问题的解决方案已在第三方包中实现。
- 密码强度检查
- 限制登录尝试
- 针对第三方的身份验证(例如OAuth)
- 对象级权限
二、用户管理(User)
Django的用户管理通过User模型类处理。
2.1 User模型的字段
username
:必要的。150 个字符或以下。用户名可包含字母数字、_
、@
、+
、.
和 -
字符。
first_name
:可空字段。150 个字符或更少。
last_name
:可空字段。150 个字符或更少。
email
:可空字段。电子邮件地址。
password
:必填字段。一个密码的哈希值和元数据。(Django 不存储原始密码。)原始密码可以任意长,可以包含任何字符。
groups:
多对多关系到 Group
user_permissions
:多对多关系到 Permission
is_staff
:布尔型。指定该用户是否可以访问管理站点。
is_active:
布尔值。指定该用户账户是否应该被视为活跃账户。我们建议你把这个标志设置为 False
,而不是删除账户;这样,如果你的应用程序对用户有任何外键,外键就不会被破坏。
is_superuser
:布尔值。指定该用户拥有所有权限,而不用一个个开启权限。
last_login:
用户最后一次登录的日期时间。
date_joined
:指定账户创建时间的日期时间。帐户创建时,默认设置为当前日期/时间。
2.2 User模型的属性
is_authenticated
:只读属性,始终返回 True
(匿名用 护AnonymousUser.is_authenticated
始终返回 False
),可通过该方法确认用户是否为用户列表中的用户。
is_anonymous:
只读属性,总是 False
。这是区分 User 和 AnonymousUser 对象的一种方式。一般来说,你应该优先使用 is_authenticated 来代替这个属性。
三、User基本操作
需要引入User模块:
from django.contrib.auth.models import User
3.1 查询所有用户
# 获取所有用户users = User.objects.all()response.append(f"All User : {users.count()}")for user in users:response.append(f"-- {user.get_username()}")
3.2 添加新用户
user1 = User.objects.create_user(username="User3",password="123456")user1.save()response.append(f"New User : {user1.get_username()}")user2 = User.objects.create_user(username="User4",password="123456")response.append(f"New User : {user2.get_username()}")
3.3 修改用户信息
user = User.objects.get(username = "User1")response.append(f"Old UserName : {user.get_username()}")user.username = "New User"user.save()user = User.objects.get(username = "New User")response.append(f"New UserName : {user.get_username()}")
3.4 修改密码
user = User.objects.get(username = "User3")response.append(f"Old Password : {user.password}")user.set_password("888888")user.save()user = User.objects.get(username = "User3")response.append(f"New Password : {user.password}")
3.5 用户验证
使用 authenticate() 来验证用户,使用时需要引入函数。它使用 username
和 password
作为参数来验证,对每个身份验证后端( authentication backend ` )进行检查。如果后端验证有效,则返回一个 :class:`~django.contrib.auth.models.User 对象。如果后端引发 PermissionDenied 错误,将返回 None
。
from django.contrib.auth import authenticateuser = authenticate(username= "New User", password = "123456")
if user is not None:response.append(f"User is exist : {user.get_username()}")
else:response.append(f"User is not exist.")
四、权限管理
4.1 创建权限
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from serverapp.models import Persondef CreatePermission(request:HttpRequest, new_permission:str):"""Create perssion"""content_type = ContentType.objects.get_for_model(Person)permission, result = Permission.objects.get_or_create(codename = new_permission,name = f"Can {new_permission}",content_type = content_type,)return HttpResponse("{0}".format(permission))
权限可以在权限表中查看到:
4.2 用户权限管理
使用User对象的groups
和 user_permissions进行权限设置。
myuser.groups.set([group_list])
myuser.groups.add(group, group, ...)
myuser.groups.remove(group, group, ...)
myuser.groups.clear()
myuser.user_permissions.set([permission_list])
myuser.user_permissions.add(permission, permission, ...)
myuser.user_permissions.remove(permission, permission, ...)
myuser.user_permissions.clear()
4.3 用户登录
from django.contrib.auth import logindef login_user(request:HttpRequest,pk:int):"""Create perssion"""login_user = User.objects.get(pk=pk)login(request, login_user)return HttpResponse("The user {0} login.".format(login_user.get_username()))
4.4 用户登出
from django.contrib.auth import logoutdef logout_user(request:HttpRequest):"""Create perssion"""logout(request)return HttpResponse("The user {0} logout.".format(request.user.get_username()))
4.5 限制未登录用户的访问
4.5.1 检查request.user.is_authenticated 状态
def login_confirm_raw(request:HttpRequest):"""Create perssion"""if not request.user.is_authenticated:return HttpResponse("The user {0} doesn't login.".format(request.user.get_username()))else:return HttpResponse("The user {0} has login.".format(request.user.get_username()))
未登录时:
登陆用户:
重新确认用户是否登录:
4.5.2 使用login_required
装饰器
from django.contrib.auth.decorators import login_required @login_required
def login_confirm(request:HttpRequest):"""Create perssion"""if not request.user.is_authenticated:return HttpResponse("The user {0} doesn't login.".format(request.user.get_username()))else:return HttpResponse("The user {0} has login.".format(request.user.get_username()))
4.6 限制已登录的用户
除了直接对用户信息进行判定外,亦可以使用user_passes_test
装饰器进行判定。
from django.contrib.auth.decorators import user_passes_testdef username_check(user:User):"""Check username"""return user.username.startswith("User")@user_passes_test(username_check)
def check(request:HttpRequest):"""check user"""return HttpResponse("The username {0} is right.".format(request.user.get_username()))
user_passes_test() 接受一个必要的参数:一个带有:class:~django.contrib.auth.models.User 对象的调用,如果允许用户访问这个页面,则返回 True
。注意,user_passes_test() 不会自动检查用户是否匿名。
user_passes_test() 可以传递两个可选参数:
login_url
允许你指定用户没有通过测试时跳转的地址。它可能是一个登录页面,如果你没指定,默认是 settings.LOGIN_URL 。
redirect_field_name
与 login_required() 相同。如果你想把没通过检查的用户重定向到没有 "next page" 的非登录页面时,把它设置为 None
,这样它会在 URL 中移除。
4.7 权限访问装饰器(permission_required
)
使用permission_required装饰器,可以快捷的确认用户是否有特定的权限。
from django.contrib.auth.decorators import permission_required@permission_required("""serverapp.add_person""")
def check_permission(request:HttpRequest):"""Check user permission"""return HttpResponse("The user {0} has permission.".format(request.user.get_username()))
有权限时:
无权限时:
相关文章:

Django学习笔记-默认的用户认证系统(auth)
一、Django默认的用户认证系统 Django 自带一个用户验证系统。它负责处理用户账号、组、权限和基于cookie的用户会话。 Django 验证系统处理验证和授权。简单来说,验证检验用户是否是他们的用户,授权决定已验证用户能做什么。这里的术语验证用于指代这…...
[SQL挖掘机] - 存储过程
介绍: 当你在sql中需要多次执行相同的一组sql语句时,存储过程是一个非常有用的工具。它是一段预先定义好的sql代码块,可以被命名并保存在数据库中,以便重复使用。 存储过程可以包含多个sql语句、逻辑流程、条件判断和循环等,可以…...

MySQL8.0.32详细安装教程(奶妈级手把手教你安装)
MySQL安装详解 前言 对于无论是刚开始接触编程的小伙伴,还是有了几年工作经验的程序猿(程序媛)来讲,数据库的安装一直都是一个比 较复杂的过程,安装完成以后可能会记得一段时间,但是等到我们换了一台电脑或…...

glut太阳系源码修改和对cpu占用观察
#include <GL/glut.h> static int day 100; // day 的变化:从 0 到 359 void myDisplay(void) {//glEnable(GL_DEPTH_TEST);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(75, 1, 1, 40…...
掌握NLTK:Python自然语言处理库中级教程
在之前的初级教程中,我们已经了解了NLTK(Natural Language Toolkit)的基本用法,如进行文本分词、词性标注和停用词移除等。在本篇中级教程中,我们将进一步探索NLTK的更多功能,包括词干提取、词形还原、n-gr…...

Go语言的崛起:探究越来越多公司选择Go语言的原因和优势
🌷🍁 博主猫头虎 带您 Go to Golang Language.✨✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~…...

MongoDB 6.0.8 安装配置
一、前言 MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 将数据存储为一个文档,数据结构由键值(key>value…...

无涯教程-Lua - nested语句函数
Lua编程语言允许在另一个循环中使用一个循环。以下部分显示了一些示例来说明这一概念。 nested loops - 语法 Lua中嵌套for循环语句的语法如下- for init,max/min value, increment dofor init,max/min value, incrementdostatement(s)endstatement(s) end Lua编程语言中的…...

如何使用vue ui创建一个项目?
首先打开cmd 输入vue ui 等待浏览器打开一个窗口,按照下图操作 在"功能页面"中,各个插件代表以下意思: Babel:Babel是一个JavaScript编译器,用于将ES6代码转换为向后兼容的JavaScript版本,以确保…...

STM32——LED内容补充(寄存器点灯及反转的原理)
文章目录 点灯流程开时钟配置IO关灯操作灯反转宏定义最后给自己说 本篇文章使用的是STM32F103xC系列的芯片,四个led灯在PE2,PE3,PE4,PE5上连接 点灯流程 1.开时钟 2.配置IO口 (1)清零指定寄存器位 (2)设置模式为推挽输…...
使用Spring Boot和EasyExcel的导入导出
在当今信息化社会,数据的导入和导出在各种业务场景中变得越来越重要。为了满足复杂的导入导出需求,结合Java编程语言、Spring Boot框架以及EasyExcel库,我们可以轻松地构建出强大而灵活的数据处理系统。本文将引导您通过一个案例学习如何使用…...

【H5移动端】常用的移动端方案合集-键盘呼起、全面屏适配、图片大小显示、300ms点击延迟、首屏优化(不定期补充~)
文章目录 前言键盘呼起问题靠近底部的输入项被键盘遮挡底部按钮被顶上去 全面屏适配图片大小显示问题解决300ms延迟首屏优化 前言 这篇文章总结了我在工作中做H5遇到的一些问题,包括我是怎么解决的。可能不是当下的最优解,但是能保证解决问题。 单位适…...

迭代器模式——遍历聚合对象中的元素
1、简介 1.1、概述 在软件开发时,经常需要使用聚合对象来存储一系列数据。聚合对象拥有两个职责:一是存储数据;二是遍历数据。从依赖性来看,前者是聚合对象的基本职责;而后者既是可变化的,又是可分离的。…...

亿赛通电子文档安全管理系统远程命令执行
人这一生,不是看你贫穷和富有,而是看你都做了些啥。 漏洞描述 亿赛通电子文档安全管理系统存在远程命令执行漏洞,攻击者通过构造特定的请求可执行任意命令 漏洞复现: 访问url: 构造payload请求 POST /solr/flow/d…...

多雷达探测论文阅读笔记:雷达学报 2023, 多雷达协同探测技术研究进展:认知跟踪与资源调度算法
多雷达协同探测技术 原始笔记链接:https://mp.weixin.qq.com/s?__biz=Mzg4MjgxMjgyMg==&mid=2247486627&idx=1&sn=f32c31bfea98b85f2105254a4e64d210&chksm=cf51be5af826374c706f3c9dcd5392e0ed2a5fb31ab20924b7dd38e1b1ae32abe9a48afa8174#rd ↑ \uparrow …...

【Redis】——AOF持久化
什么是AOF日志 AOF日志是redis为数据的持久化提供了的一个技术,日志里面记录着执行redis写命令。每当redis执行一条写命令的时候,就会将该命令记录 到AOF日志当中。当redis启动的时候,可以加载AOF日志中的所有指令,并执行这些指令恢复所有的…...

Keil MDK环境下FreeModebus移植踩坑记录
Keil MDK环境下FreeModebus移植踩坑记录 文章目录 Keil MDK环境下FreeModebus移植踩坑记录armcc (arm compiler v5)环境实验一:实验二: armclang (arm compiler v6)环境实验一:实验二:实验三:实验四 总结 armcc (arm c…...
计算机视觉的延伸整理
计算机视觉是一门涉及数字图像处理、模式识别和机器学习等技术的交叉学科,旨在将计算机技术应用于对视觉信息的理解和处理。其主要研究内容包括图像和视频处理、目标检测和跟踪、三维重建、人脸识别、自动驾驶等。计算机视觉已经被广泛应用于医学影像分析、安防监控…...

通过Idea部署Tomcat服务器(详细图文教学)
1.在idea中创建项目 有maven构建工具就创建maven,没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意:创建web项目后我们需要配置tomcat才能运行,下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…...

Window版本ES(ElasticSearch)的安装,使用,启动
首先我这里是根据小破站狂神说up主,而学习的,下面是笔记文档,文档可能比我更细,但我还是记录一下,嘿嘿嘿 ElasticSearch7.6入门学习笔记-KuangStudy-文章 下面直接开始,首先我们需要下载ELK三个安装包&…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...