青少年编程与数学 02-009 Django 5 Web 编程 16课题、权限管理
青少年编程与数学 02-009 Django 5 Web 编程 16课题、权限管理
- 一、授权
- 授权的主要特点和作用
- 授权的类型
- 应用场景
- 二、权限系统
- 使用Django内置的权限系统
- 使用组管理权限
- 使用第三方库
- 在视图中应用权限
- 三、权限管理示例
- 步骤 1: 创建Django项目和应用
- 步骤 2: 定义模型和权限
- 步骤 3: 创建表单
- 步骤 4: 创建视图
- 步骤 5: 创建模板
- 步骤 6: 配置URLs
- 步骤 7: 迁移数据库
- 步骤 8: 创建超级用户
- 步骤 9: 运行项目
- 步骤 10: 分配权限
课题摘要: 本文深入探讨了Django中的权限管理,包括授权的基本概念、类型和应用场景。授权是在用户身份验证后,确定用户能否执行特定操作或访问特定资源的过程。文章介绍了基于角色、属性和策略的访问控制方法,并详细讲解了Django内置权限系统和第三方库如django-guardian的使用。通过一个示例项目,展示了如何定义模型权限、分配权限给用户或组、创建视图和模板来管理书籍信息,并在视图中应用权限检查,确保只有授权用户能访问特定功能。
一、授权
授权(Authorization)是计算机安全和网络通信领域中的一个概念,指的是决定某个用户或实体是否有权限执行特定操作或访问特定资源的过程。授权通常发生在用户身份验证(Authentication)之后,即在确认用户身份之后,进一步确定用户可以做什么。
授权的主要特点和作用
- 基于身份验证:授权通常在用户通过身份验证后进行。身份验证确认用户是谁,而授权确定用户可以做什么。
- 访问控制:授权用于实现访问控制,确保用户只能访问他们被允许访问的资源和执行他们被允许的操作。
- 权限管理:通过为用户或用户组分配权限,可以管理用户对不同资源的访问权限。权限可以是细粒度的,例如读取、写入、修改、删除等。
- 安全策略实施:授权是实施组织安全策略的关键环节,通过限制用户权限来降低安全风险。
授权的类型
-
基于角色的访问控制(RBAC):
- 根据用户的角色来分配权限。角色是一组权限的集合,用户通过被分配角色来获得相应的权限。
- 例如,一个“管理员”角色可能拥有对所有资源的完全访问权限,而“普通用户”角色可能只能访问有限的资源。
-
基于属性的访问控制(ABAC):
- 根据用户、资源和环境的属性来动态决定访问权限。
- 例如,只有当用户的工作部门与资源所属部门相同时,用户才能访问该资源。
-
基于策略的访问控制(PBAC):
- 使用一组策略来定义访问权限,策略可以基于多种条件和规则。
- 例如,策略可以规定“在工作时间内,只有部门经理可以访问敏感数据”。
应用场景
- 操作系统:文件系统权限管理,如在Linux中,文件和目录的权限可以设置为读、写、执行等。
- Web应用:控制用户对不同页面、功能和数据的访问,如只有登录用户才能查看订单历史,只有管理员才能管理用户账户。
- 企业系统:在企业资源规划(ERP)系统中,不同部门的员工根据其职位和职责拥有不同的权限。
授权是确保信息安全和资源合理使用的重要机制,通过合理的授权策略,可以有效地保护系统不受未授权访问的威胁。
二、权限系统
在Django中完成用户授权主要依赖于其内置的权限和组系统,以及一些第三方库来扩展授权功能。以下是几种常见的用户授权方法:
使用Django内置的权限系统
Django的权限系统允许你为用户和组分配权限,从而控制用户对模型的访问。以下是基本步骤:
-
定义权限:
- 在模型中定义权限。例如,在
models.py中:from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=100)author = models.CharField(max_length=100)class Meta:permissions = (("can_read_book", "Can read book"),("can_edit_book", "Can edit book"),) - 这将为
Book模型创建两个自定义权限。
- 在模型中定义权限。例如,在
-
分配权限:
- 可以为用户或组分配权限。例如,在Django管理后台或通过代码:
from django.contrib.auth.models import User, Permission from django.contrib.contenttypes.models import ContentType from myapp.models import Bookuser = User.objects.get(username='john') content_type = ContentType.objects.get_for_model(Book) permission = Permission.objects.get(content_type=content_type, codename='can_edit_book') user.user_permissions.add(permission)
- 可以为用户或组分配权限。例如,在Django管理后台或通过代码:
-
检查权限:
- 在视图或模板中检查用户是否有特定权限:
# 在视图中 if request.user.has_perm('myapp.can_edit_book'):# 执行操作
- 在视图或模板中检查用户是否有特定权限:
使用组管理权限
- 创建组:在Django管理后台或通过代码创建组,并为组分配权限。
- 将用户添加到组:用户继承组的权限。
from django.contrib.auth.models import Groupgroup = Group.objects.get(name='Editors') user.groups.add(group)
使用第三方库
- django-guardian:提供对象级别的权限管理,允许你为特定对象分配权限。
在pip install django-guardiansettings.py中添加:
使用示例:INSTALLED_APPS = [# ...'guardian', ] AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', # default'guardian.backends.ObjectPermissionBackend', )from guardian.shortcuts import assign_perm from myapp.models import Bookbook = Book.objects.get(id=1) assign_perm('can_edit_book', user, book)
在视图中应用权限
-
基于类的视图:使用
PermissionRequiredMixin或自定义装饰器。from django.contrib.auth.mixins import PermissionRequiredMixin from django.views.generic import DetailView from myapp.models import Bookclass BookDetailView(PermissionRequiredMixin, DetailView):model = Bookpermission_required = 'myapp.can_read_book' -
基于函数的视图:使用
permission_required装饰器。from django.contrib.auth.decorators import permission_required from django.shortcuts import render from myapp.models import Book@permission_required('myapp.can_read_book') def book_detail(request, pk):book = Book.objects.get(pk=pk)return render(request, 'book_detail.html', {'book': book})
通过这些方法,你可以在Django中灵活地实现用户授权,确保用户只能访问他们被允许访问的资源和执行他们被允许的操作。
三、权限管理示例
以下是一个完整的Django权限管理示例项目,演示了如何使用Django内置的权限系统来管理用户权限:
步骤 1: 创建Django项目和应用
打开终端或命令提示符,执行以下命令:
django-admin startproject myproject
cd myproject
python manage.py startapp myapp
步骤 2: 定义模型和权限
在 myapp/models.py 文件中定义一个模型,并为其添加自定义权限:
from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=100)author = models.CharField(max_length=100)class Meta:permissions = (("can_read_book", "Can read book"),("can_edit_book", "Can edit book"),)def __str__(self):return self.title
步骤 3: 创建表单
在 myapp/forms.py 文件中创建一个表单,用于创建书籍:
from django import forms
from .models import Bookclass BookForm(forms.ModelForm):class Meta:model = Bookfields = ['title', 'author']
步骤 4: 创建视图
在 myapp/views.py 文件中创建视图,用于处理书籍的创建和查看,并检查用户权限:
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required, permission_required
from .models import Book
from .forms import BookForm@login_required
def book_list(request):books = Book.objects.all()return render(request, 'book_list.html', {'books': books})@login_required
@permission_required('myapp.can_read_book', raise_exception=True)
def book_detail(request, pk):book = get_object_or_404(Book, pk=pk)return render(request, 'book_detail.html', {'book': book})@login_required
@permission_required('myapp.can_edit_book', raise_exception=True)
def book_create(request):if request.method == 'POST':form = BookForm(request.POST)if form.is_valid():form.save()return redirect('book_list')else:form = BookForm()return render(request, 'book_form.html', {'form': form})
步骤 5: 创建模板
在 myapp/templates 目录下,创建以下HTML模板文件:
-
book_list.html:{% extends 'base.html' %}{% block content %}<h2>Book List</h2><a href="{% url 'book_create' %}">Create Book</a><ul>{% for book in books %}<li><a href="{% url 'book_detail' book.pk %}">{{ book.title }}</a></li>{% endfor %}</ul> {% endblock %} -
book_detail.html:{% extends 'base.html' %}{% block content %}<h2>{{ book.title }}</h2><p>Author: {{ book.author }}</p><a href="{% url 'book_list' %}">Back to list</a> {% endblock %} -
book_form.html:{% extends 'base.html' %}{% block content %}<h2>Create Book</h2><form method="post">{% csrf_token %}{{ form.as_p }}<button type="submit">Save</button></form> {% endblock %} -
base.html(基础模板):<!DOCTYPE html> <html> <head><title>Book Management</title> </head> <body><div>{% if user.is_authenticated %}<p>Welcome, {{ user.username }}!</p><a href="{% url 'logout' %}">Logout</a>{% else %}<a href="{% url 'login' %}">Login</a>{% endif %}</div><hr>{% block content %}{% endblock %} </body> </html>
步骤 6: 配置URLs
在 myapp/urls.py 文件中定义应用的URLs:
from django.urls import path
from . import viewsapp_name = 'myapp'urlpatterns = [path('', views.book_list, name='book_list'),path('book/<int:pk>/', views.book_detail, name='book_detail'),path('book/create/', views.book_create, name='book_create'),
]
在 myproject/urls.py 文件中包含应用的URLs:
from django.contrib import admin
from django.urls import path, include
from django.contrib.auth.views import LoginView, LogoutViewurlpatterns = [path('admin/', admin.site.urls),path('accounts/login/', LoginView.as_view(), name='login'),path('accounts/logout/', LogoutView.as_view(), name='logout'),path('', include('myapp.urls')),
]
步骤 7: 迁移数据库
运行以下命令来创建数据库表:
python manage.py makemigrations
python manage.py migrate
步骤 8: 创建超级用户
创建一个超级用户,以便可以登录Django管理后台:
python manage.py createsuperuser
步骤 9: 运行项目
启动Django开发服务器:
python manage.py runserver
步骤 10: 分配权限
- 登录Django管理后台(
http://127.0.0.1:8000/admin/)。 - 创建普通用户,并为其分配相应的权限(如
can_read_book和can_edit_book)。 - 创建书籍数据,以便在应用中查看和编辑。
现在,你可以访问 http://127.0.0.1:8000/ 查看书籍列表,并根据分配的权限查看或创建书籍。只有具有相应权限的用户才能访问特定的功能。
相关文章:
青少年编程与数学 02-009 Django 5 Web 编程 16课题、权限管理
青少年编程与数学 02-009 Django 5 Web 编程 16课题、权限管理 一、授权授权的主要特点和作用授权的类型应用场景 二、权限系统使用Django内置的权限系统使用组管理权限使用第三方库在视图中应用权限 三、权限管理示例步骤 1: 创建Django项目和应用步骤 2: 定义模型和权限步骤 …...
Baklib知识中台构建企业智能运营核心架构
内容概要 在数字化转型的浪潮中,企业对于知识的系统化管理需求日益迫切。Baklib作为新一代的知识中台,通过构建智能运营核心架构,为企业提供了一套从知识汇聚到场景化落地的完整解决方案。其核心价值在于将分散的知识资源整合为统一的资产池…...
Java爬虫获取1688商品搜索API接口的实现指南
在电商数据分析、市场调研以及商品选品等领域,按关键字搜索1688商品并获取相关数据是一项重要的任务。本文将详细介绍如何使用Java爬虫技术,通过1688的API接口按关键字搜索商品,并解析返回的数据。以下是实现的完整步骤和代码示例。 一、前期…...
Ubuntu启动geteck/jetlinks实战:Docker启动
参考: JetLinks 物联网基础平台 安装Docker Ubuntu下载安装Docker-Desktop-CSDN博客 sudo apt install -y docker-compose 下载源码 # github亦可 git clone https://gitee.com/jetlinks/jetlinks-community.git cd jetlinks-community 启动 cd docker/run-a…...
保姆级GitHub大文件(100mb-2gb)上传教程
GLF(Git Large File Storage)安装使用 使用GitHub desktop上传大于100mb的文件时报错 The following files are over 100MB. lf you commit these files, you will no longer beable to push this repository to GitHub.com.term.rarWe recommend you a…...
【16届蓝桥杯寒假刷题营】第2期DAY1I
4.有向无环的路径数 - 蓝桥云课 问题描述 给定 N 个节点 M 条边的有向无环图,请你求解有多少条 1 到 N 的路径。 由于答案可能很大,你只需要输出答案对 998244353 取模后的结果。 输入格式 第一行包含 2 个正整数 N,M,表示有向无环图的节…...
WEB安全--SQL注入--PDO与绕过
一、PDO介绍: 1.1、原理: PDO支持使用预处理语句(Prepared Statements),这可以有效防止SQL注入攻击。预处理语句将SQL语句与数据分开处理,使得用户输入的数据始终作为参数传递给数据库,而不会直…...
SQL与数据库程序设计
1.1986年,10月美国国家标准局颁布了SQL语言的美国标准,称为SQL86 2.SQL(Structured Query Language)又称为结构化查询语言 3.建立索引的主要目的是加快查找的速度 4.在基本表上建立一个或者多个索引 5. 一个基本表是最多只能建立一个聚簇索引 6.CAL…...
软考高级《系统架构设计师》知识点(五)
计算机网络 网络概述和模型 计算机网络是计算机技术与通信技术相结合的产物,它实现了远程通信、远程信息处理和资源共享。 计算机网络的功能:数据通信、资源共享、管理集中化、实现分布式处理、负载均衡。 网络性能指标:速率、带宽(频带宽度或…...
DeepSeek 助力 Vue 开发:打造丝滑的面包屑导航(Breadcrumbs)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
Ubuntu 系统 LVM 逻辑卷扩容教程
Ubuntu 系统 LVM 逻辑卷扩容教程 前言 在 Linux 系统中,LVM(Logical Volume Manager)是一种逻辑卷管理工具,允许管理员动态调整磁盘空间,而无需重启系统。 本文将详细介绍如何使用 LVM 扩容逻辑卷,以实现…...
美团一面,有点难度。
一位粉丝朋友分享了最近参与美团民宿旅游业务线的一面的经历,全程约1小时,面试官围绕高并发、分布式事务、性能优化等高频考点展开追问,问题密集且注重落地细节。以下是完整问题整理回答思路扩展解析,助你避坑! 一、项…...
7-Zip Final绿色版:高效压缩解压缩工具
在工作与学习旅程中,我们时常需要与各式各样的文件和文件夹打交道。为了更有效地利用存储空间或促进文件的便捷传输,压缩与解压工具自然而然地成为了我们不可或缺的助手。在众多同类工具中,7-Zip凭借其高效能、免费及开源的特性,深…...
详解如何使用Pytest内置Fixture tmp_path 管理临时文件
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 临时目录在测试中起着至关重要的作用,它为执行和验证代码提供了一个可控…...
QML使用ChartView绘制饼状图
一、工程配置 首先修改CMakeLists.txt,按下图修改: find_package(Qt6 6.4 REQUIRED COMPONENTS Quick Widgets) PRIVATEtarget_link_libraries(appuntitledPRIVATE Qt6::QuickPRIVATE Qt6::Widgets )其次修改main.cpp,按下图修改ÿ…...
用大模型学大模型03-数学基础 概率论 最大似然估计(MLE)最大后验估计(MAP)
https://metaso.cn/s/r4kq4Ni 什么是最大似然估计(MLE)最大后验估计(MAP)?深度学习中如何应用,举例说明。 好的,我现在需要回答关于最大似然估计(MLE)和最大后验估计&…...
Rust学习总结之结构体(一)
一:结构体定义 定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段(field…...
【Android开发】华为手机安装包安装失败“应用是非正式版发布版本,当前设备不支持安装”问题解决
问题描述 我们将Debug版本的安装包发送到手机上安装,会发现华为手机有如下情况 解决办法 在文件gradle.properties中粘贴代码: android.injected.testOnlyfalse 最后点击“Sync now”,等待重新加载gradle资源即可 后面我们重新编译Debug安装…...
Ubuntu添加桌面快捷方式
以idea为例 一. 背景 在ubuntu中,很多时候是自己解压的文件并没有桌面快捷方式,需要自己找到对应的目录的执行文件手动打开,很麻烦 而只需要在 /usr/share/applications 中创建自定义的desktop文件就能自动复制到桌面 二. 添加方法 创建desk…...
day09_实时类标签/指标
文章目录 day09_实时类标签/指标一、日志数据实时采集2、Flume简介2.3 项目日志数据采集Flume配置2.3.1 涉及的Flume组件和参数2.3.2 Nginx日志采集2.3.3 用户行为日志采集 二、Nginx日志数据统计1、日志格式说明2、数据ETL2.1 日志抽取2.1.1 正则表达式2.1.2 基于Spark实现Ngi…...
排序算法的魔法世界:用C语言揭开数据排列的奥秘
当数据开始跳集体舞:排序的意义 想象你面前有一群调皮的数字精灵在开派对,7和3在跳探戈,9和1在玩捉迷藏,5和2在抢蛋糕。这时候就需要排序算法这位神奇的派对管家出场了!它像音乐指挥家一样挥动魔棒,让所有数字精灵乖乖排成整齐的队伍。在计算机的世界里,排序算法就是处…...
网页模板免费HTML源码 HTML网页设计模板
在现代网站开发中,拥有一个美观且功能齐全的网页模板是至关重要的。对于许多开发者和设计师来说,获取高质量的免费HTML源码和网页设计模板可以大大简化开发流程。本文将探讨网页模板免费HTML源码的资源、优势以及如何有效利用这些模板。 什么是网页模板…...
Python实现语音识别详细教程【2025】最新教程
文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python3 使用 pip 安装必要的库 二、使用 SpeechRecognition 库进行语音识别1.识别本地音频文件2.实时语音识别3. 使用其他语音识别引擎 注意事项 前言 以下是一份较为完整的 Python 语音识别教程,涵盖环境搭建、使…...
与传统光伏相比 城电科技的光伏太阳花有什么优势?
相比于传统光伏,城电科技的光伏太阳花有以下优势: 一、发电效率方面 智能追踪技术:光伏太阳花通过内置的智能追踪系统,采用全球定位跟踪算法,能够实时调整花瓣(即光伏板)的角度,确…...
Qt——连接MySQL数据库之ODBC的方法详细总结(各版本大同小异,看这一篇就够了)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…...
Python的那些事第二十二篇:基于 Python 的 Django 框架在 Web 开发中的应用研究
基于 Python 的 Django 框架在 Web 开发中的应用研究 摘要 Django 是一个基于 Python 的高级 Web 框架,以其开发效率高、安全性和可扩展性强等特点被广泛应用于现代 Web 开发。本文首先介绍了 Django 的基本架构和核心特性,然后通过一个实际的 Web 开发项目案例,展示了 Dj…...
pytest测试专题 - 1.3 测试用例发现规则
<< 返回目录 1 pytest测试专题 - 1.3 测试用例发现规则 执行pytest命令时,可以不输入参数,或者只输入文件名或者目录名,pytest会自己扫描测试用例。那pytest基于什么规则找到用例呢? 文件名:满足文件名称为tes…...
【Bluedroid】 BLE连接源码分析(一)
BLE链接过程分析见【Bluedroid】BLE连接过程详解-CSDN博客,本篇主要围绕HCI_LE_Create_Connection展开。基于Android14源码进行分析。在蓝牙低功耗技术中,设备之间建立连接是进行数据传输等操作的前提。HCI LE Extended Create Connection Command 提供了一种更灵活、功能更丰…...
Unity DeepSeek API 聊天接入教程(0基础教学)
Unity DeepSeek API 聊天接入教程(0基础教学) 1.DeepSeek 介绍 DeepSeek是杭州深度求索人工智能基础技术研究有限公司推出的一款大语言模型。2025年1月20日,DeepSeek-R1正式上线,和当前市面上的主流AI相比,它在仅有极少标注数据的情况下&am…...
【16届蓝桥杯寒假刷题营】第1期DAY4
4.可达岛屿的个数 - 蓝桥云课 题目背景 在一个神奇的魔法世界中,有一座古老的迷幻之城。迷幻之城被分成 n 个鸟屿,编号从 1 到 n,共有 m 座桥。迷幻之城的居民们希望能够建立起紧密的联系,每个岛屿上的居民都想知道自己最多能到…...
