Django学习笔记-默认的用户认证系统(auth)

news2024/11/18 9:19:58

一、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 authenticate

user = 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 Person

def 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 login

def 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 logout

def 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_test

def 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()))

有权限时:

 无权限时:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/831359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云原生】K8S二进制搭建一

目录 一、环境部署1.1操作系统初始化 二、部署etcd集群2.1 准备签发证书环境在 master01 节点上操作在 node01与02 节点上操作 三、部署docker引擎四、部署 Master 组件4.1在 master01 节点上操 五、部署Worker Node组件 一、环境部署 集群IP组件k8s集群master01192.168.243.1…

虹科方案 | 虹科AR助力汽车产业降本增效,实现数字化转型!

虹科AR远程解决方案 将高性能的Vuzix AR眼镜与工业远程软件相结合,一线员工使用AR眼镜呼叫专家,由远程专家进行诊断并给出建议,支持一线员工与远程专家实时语音视频交互、AR标注指引、发送文件图片并进行会议录制,帮助一线员工解…

8.物联网操作系统之事件标志组

。事件标志组定义 FreeRTOS事件标志组介绍 FreeRTOS事件标志组工作原理 一。事件标志组定义 信号量信号量只能实现任务与单个事件或任务间的同步。但是某些任务可能会需要与多个事件或任务进行同步,此时就可以使用事件标志组来解决。事件标志组能够实现某个任务与…

opencv36-形态学操作-膨胀 cv2.dilate()

膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的…

接口测试原理和基本步骤

目录 1、接口测试原理 2、接口测试的实现 3、接口测试用例 4、接口测试工具 5、HTTP协议 6、JMeter 7、抓包 8、接口测试可以发现什么样的Bug? 1、接口测试原理 接口测试,实际上是针对于接口做测试的。 那么接口是什么? 软件开发&…

人力管理系统servlet+jsp人事考勤员工部门java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 人力管理系统servletjsp 系统有1权限:管理…

Linux - gcc/g++工具使用

gcc/g是用于编译C/C程序的编译器 1.编译过程 1. 预处理(头文件展开,条件编译,进行宏替换,去注释等) 2. 编译(C语言汇编语言) 3. 汇编(汇编->可重定位目标二进制文件,不可以被执行的&#xff…

图解系列 非对称加密应用场景

非对称加密使用一对密钥,分别是公钥(public key)和私钥(private key)。 使用场景 加密场景 加密场景 公钥加密、私钥解密: 公钥加密:在这种场景下,使用接收方的公钥对数据进行加密…

Spring源码解析(六):bean定义后置处理器ConfigurationClassPostProcessor

Spring源码系列文章 Spring源码解析(一):环境搭建 Spring源码解析(二):bean容器的创建、默认后置处理器、扫描包路径bean Spring源码解析(三):bean容器的刷新 Spring源码解析(四):单例bean的创建流程 Spring源码解析(五)&…

数据结构 | 搜索和排序——排序

目录 一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、归并排序 六、快速排序 排序是指将集合中的元素按照某种顺序排序的过程。 一、冒泡排序 冒泡排序多次遍历列表。它比较相邻的元素,将不合顺序的交换。每一轮遍历都将下一个最大值放到正确的位…

校园跑腿小程序运营攻略

作为一名校园跑腿小程序的运营者,你可能会面临诸如用户获取、平台推广、服务质量保证等挑战。在本篇推文中,我将为你提供一些关键的运营策略,帮助你成功运营校园跑腿小程序。 1. 用户获取和留存 用户是校园跑腿小程序成功的关键。以下是一些…

非凸科技受邀参加中科大线上量化分享

7月30日,非凸科技受邀参加由中国科学技术大学管理学院学生会、超级量化共同组织的“打开量化私募的黑箱”线上活动,分享量化前沿以及求职经验,助力同学们拿到心仪的offer。 活动上,非凸科技量化策略负责人陆一洲从多个角度分享了如…

基于Windows手动编译openssl和直接安装openssl

零、环境 win10-64位 VS2019 一、手动编译 1、安装perl https://platform.activestate.com/ActiveState-Projects/ActiveState-Perl-5.36.0 两种方法都没能成功。。第一种下载后会得到一个 state-remote-installer.exe,然后安装时会在命令行中执行,…

PtahDAO:全球首个DAO治理资产信托计划的金融平台

金融科技是当今世界最具创新力和影响力的领域之一,区块链技术作为金融科技的核心驱动力,正在颠覆传统的金融模式,为全球用户提供更加普惠、便捷、安全的金融服务。在这个变革的浪潮中,PtahDAO(普塔道)作为全…

UMS攸信入选2023年先进制造业倍增计划企业名单,为企业发展增添新助力!

根据《厦门市人民政府关于印发先进制造业倍增计划实施方案(2022-2026年)的通知》(厦府规〔2022〕3号),经市政府专题会研究,确定2023年先进制造业倍增计划企业名单。 关于2023年先进制造业倍增计划企业名单和…

【知网检索】2023年金融,贸易和商业管理国际学术会议(FTBM2023)

随着经济全球化,贸易自由化的进程加快,我国经济对外开放程度不断加深,正在加快融入世界经济一体化当中。当今世界各国竞争过程中,金融、贸易以及商业形态已成为其关键与焦点竞争内容。 2023年金融、贸易和商业管理国际学术会议(F…

百度飞桨助力高校培养AI大模型人才,2023年飞桨产学合作项目申报启动

7月7日,教育部产学合作协同育人项目公布项目指南通过的企业名单,百度被列入2023年(5月)批次名单;其中百度飞桨与文心大模型项目40个,包含教学内容和课程体系改革、实践条件和实践基地建设、师资培训项目三大…

途游游戏 x 极狐GitLab “通关” DevOps :单元测试从无到优,覆盖率 0→80%

目录 4 个工具孤岛 → 极狐GitLab 全家桶, 被动的「人找进度」 → 高效的「进度找人」 把 Code Review 做扎实 代码质量「向左移」,修复成本「往下降」 从无到「优」 自动执行单元测试,覆盖率 0→80% 你喜欢玩游戏吗? 最近…

概念辨析 | SAR运动补偿和自聚焦技术:深入探索雷达图像

注1:本文系“概念辨析”系列之一,致力于简洁清晰地解释、对比复杂而专业的概念。本次辨析的概念是:合成孔径雷达(SAR)的运动补偿和自聚焦技术。 SAR运动补偿和自聚焦技术:深入探索雷达图像 Synthetic Aperture Radar (SAR) 1 背景介绍 合成孔径雷达(Synthetic Aperture R…

打印机地址换了怎么连接

原先的打印机地址:172.16.17.10 添加新打印机地址:winR打开,在运行里输入更改后的地址(\\ip)\\172.16.17.40确定,右键链接。就可以在你要用到的地方看到这个设备了