Django一分钟:借助Django的认证系统快速实现RBAC权限校验以及Session会话

news/2024/9/29 5:25:03/
webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

引言

Django自带一套认证与权限系统帮助我们快速的实现RBAC权限控制。今天我们要讨论的是Django的认证与权限系统怎么使用,以及Django在背后为我们做了些什么。

一、权限系统会创建数据库表

如果使用了Django的认证系统(在settings中注册app'django.contrib.auth'),初次执行migrate迁移,Django会自动在数据库中创建5张表:用户、权限、组以及三者两两之间的关系表。这在RBAC权限管理系统的数据库表设计中非常常见。

  • user
  • group
  • permission
  • user_group
  • group_permission
  • user_permission

在使用Django的认证系统我们需要知道以下几件事:

  1. 我们可以自己在permission表中创建一些权限,但通常来说不需要,Django在执行数据库迁移时,会自动为已注册app的模型创建增、删、改、查四个权限。
  2. 我们可以为用户分配权限,本质上就是在user_permission关系表中创建一条数据。我们也可以创建一个组,你可以将组命名为“采购部门”,为组分配权限,被分配到这个组中的用户将自动获取这个组的权限。
  3. 通过createsuperuser 创建的超级用户会拥有所有的权限(准确来说是自动通过权限认证),普通用户的权限需要自己分配。

二、创建和验证用户

我们可以直接使用Django中的User模型创建用户。创建组和权限也是一样的做法,它们都是普通的模型,只不过Django提前帮我们写好了。

python">from django.contrib.auth.models import User
user = User.objects.create_user("john", "lennon@thebeatles.com", "johnpassword")

Django不在数据库中存储用户的明文密码,(不在数据库中存储用户的明文密码是基本常识),而是存储散列值。

验证用户密码需要通过内置的authenticate方法,验证成功会获取获取到对应User对象,在登录的步骤中我们会用到此方法:

python">from django.contrib.auth import authenticateuser = authenticate(username="john", password="secret")
if user is not None:print("验证成功")
else:print("验证失败")

可以重置密码:

python">from django.contrib.auth.models import User
u = User.objects.get(username="john")
u.set_password("new password")
u.save()

查看用户权限直接使用user对象的has_perm方法:

python">user.has_perm("myapp.change_blogpost")

三、登录、登出与会话

Django使用Session(会话)和中间件将身份验证系统和请求对象request连接在一起

当请求进来时,我们在视图函数中可以获取到request: HttpRequest我们可以检查user是否通过授权,即是否登录。

python">if request.user.is_authenticated:print("已登录用户")
else:print("未登录用户")

用户登录需要调用login()方法。该方法会为传入的user对象在数据库的session表中创建一条数据,这代表该用户的会话信息,会话可以控制用户的登录状态。Django会将SessionID设置到响应头中的SET-COOKIE字段里返回给用户的浏览器客户端,这样浏览器客户端就会自动存储用户cookie,并为用户以后的每条请求带上cookie,我们后端就能区分用户的身份和会话状态了。

python">from django.contrib.auth import authenticate, login
ef my_view(request):username = request.POST["username"]password = request.POST["password"]user = authenticate(request, username=username, password=password)if user is not None:# 用户通过验证之后就执行登录函数login(request, user)

登出只需对请求对象使用logout方法:

python">def logout_view(request):logout(request)

四、权限控制

我们可以通过不同的方法检查用户是否登录:

  1. 通过request.user.is_authenticated方法:
python">def my_view(request):if not request.user.is_authenticated:return render(request, "myapp/login_error.html")
  1. 通过@login_required装饰器:

你需要设置settings.LOGIN_URL控制未登录用户被重定向的页面

python">from django.contrib.auth.decorators import login_required@login_required
# @login_required(login_url="/accounts/login/")
def my_view(request): ...
  1. 在视图类中使用LoginRequiredMixin
python">from django.contrib.auth.mixins import LoginRequiredMixinclass MyView(LoginRequiredMixin, View):# 可选配置login_url = "/login/"redirect_field_name = "redirect_to"

控制权限方法也类似:

  1. 直接检查
python">def my_view(request):if not request.user.has_perm("myapp.change_blogpost"):print("用户无权更改blogpost")
  1. 使用装饰器
python">from django.contrib.auth.decorators import permission_required@permission_required("polls.add_choice")
def my_view(request): ...

你可以提供raise_exception参数,装饰器将会触发PermissionDenied,从而触发403(HTTP Forbidden)视图,比较常用:

python">from django.contrib.auth.decorators import login_required, permission_required@login_required
@permission_required("polls.add_choice", raise_exception=True)
def my_view(request): ...
  1. 在视图类中使用PermissionRequiredMixin
python">from django.contrib.auth.mixins import PermissionRequiredMixinclass MyView(PermissionRequiredMixin, View):permission_required = "polls.add_choice"# 或者:permission_required = ["polls.view_choice", "polls.change_choice"]

总结

  • Django会在数据库中创建辅助认证和会话系统的表。
  • 用户登录和登出会自动创建和删除会话。
  • 在视图中获request对象手动对用户的身份和权限进行验证,Django内置的装饰器和混入类可以给我们提供帮助。

http://www.ppmy.cn/news/1530757.html

相关文章

【网络安全】网络基础第一阶段——第三节:网络协议基础---- VLAN、Trunk与三层交换技术

目录 一、交换机 1.1 交换机定义 1.1.1 交换机 1.2 工作原理 1.2.1 数据帧的转发 1.2.2 交换机处理数据帧的三种行为 1.2.3 交换机通信 二、虚拟局域网(VLAN) 2.1 虚拟局域网简介 2.1.1 为什么需要VLAN 2.1.2 广播域的分割与VLAN的必要性 2.…

毕设基于SSM+Vue3实现设备维修管理系统四:后台框架及基础增删改查功能实现

本章介绍后端基础框架及基础的增删改查功能实现,创建基础的dao、service即controller层相关的基类,并实现基础的增删改查相关功能。 源码下载:点击下载 讲解视频: SMMVUE3实现设备维修管理系统毕设:后端框架搭建及表外…

SQLServer TOP(Transact-SQL)

1、本文内容 语法参数最佳实践兼容性支持互操作性限制和局限示例 适用于: Microsoft Fabric Microsoft FabricWarehouse 中的 SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure SynapseAnalytics Analytics Platform System (PDW)SQL A…

高级Python Web开发架构与设计模式

高级Python Web开发架构与设计模式 目录 🏗️ 架构风格概述 1.1 🖼️ MVC与MTV架构模式的对比1.2 🌐 RESTful与GraphQL的设计差异1.3 ⚙️ CQRS在Web应用中的应用1.4 🎉 事件驱动架构的应用与设计 🧩 设计模式详解 2…

ppt一键生成免费版软件有哪些?如何高效生成论文答辩?

答辩经验丰富的人都知道,制作论文答辩ppt是一项既繁琐又耗时的工作。 我们需要从数万字的论文中提炼关键点,梳理内容的逻辑关系,然后进行细致的排版和美化,最后还要进行反复的检查和试讲。整个过程不仅耗费时间,而且需…

C# Linq介绍

LINQ(Language Integrated Query)是 C# 和其他 .NET 语言中的一种查询语法,它允许开发人员直接在代码中使用类似 SQL 的语法来查询和操作数据。LINQ 的目标是为不同的数据源(如集合、数据库、XML 等)提供统一的查询方式…

从预测性维护到智能物流:ARM边缘计算控制器的工业实践

工业4.0时代的到来,边缘计算技术成为连接物理世界与数字世界的桥梁。ARM架构的边缘计算控制器凭借其低功耗、高能效和灵活性等特点,在工业自动化领域展现出巨大潜力。本文将通过几个实际应用案例来探讨ARM边缘计算控制器是如何提升生产线效率和安全性的&…

【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下)

系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上) 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下) 文章目录 系列文章目录前言一、装饰器语法6.Builder语法:(1&…