热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python权限控制_[Python学习]Django权限控制

本文为大家讲解Django框架里自带的权限模型,从理论到实战演练,带领大家了解Django里权限是怎么一回事。主要内容什么是权限管理?We

0aec42fd51c1

本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事。

主要内容

什么是权限管理?

Web 权限

Django 权限机制

Django 的权限项

权限应用

Permission(一)

Permission(二)

User Permission 管理(一)

User Permission 管理(二)

Group Permission 管理

权限验证(一)

权限验证(二)

权限验证(三)

权限验证(四)

什么是权限管理

权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源

权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个系统有多个权限级别就如一间屋有多个门,想要把所有门都打开您必须要取得所有的钥匙,就如系统一样。

Web 权限

在 Web 里权限管理是 Web 应用项目中比较关键的环节,因为浏览器是每一台计算机都已具备的,如果不建立权限管理系统,那么一个“非法用户”可以轻而易举通过浏览器访问Web应用项目中的所有功能。因此需要权限管理系统进行权限检测,让经过授权的用户可以正常合法的使用已授权的功能,而对那些未授权的非法用户拒之门外。 一个好的权限管理系统应该对每一类或每一个用户,分配不同的系统操作权限,并应具有扩展性,也就是它可以加入到任何一个带有权限管理的 Web 应用项目中,就像构件一样可以被重复使用。 同时,还要提醒开发者,开发一个 Web 应用项目时,应尽可能的将整个系统细化,分解为若干个子模块,最后组合成一个完整的应用。也只有这样,才容易实现为每一类或每一个用户分配不同的操作权限。

Django 权限机制

Django 权限机制能够约束用户行为,控制页面的显示内容,也能使 API 更加安全和灵活;用好权限机制,能让系统更加强大和健壮

Django 用 user, group 和 permission 完成了权限机制,这个权限机制是将属于 model 的某个 permission 赋予 user 或 group,可以理解为全局的权限,即如果用户A对数据模型(model)B 有可写权限,那么 A 能修改model B 的所有实例(objects)。group 的权限也是如此,如果为 group C 赋予 model B 的可写权限,则隶属于 group C 的所有用户,都可以修改model B 的所有实例。

Django 的权限项

Django 用 permission 对象存储权限项,每个model默认都有三个permission,即 add model, change model 和 delete model

permission 总是与 model 对应的,如果一个 object 不是 model 的实例,我们无法为它创建/分配权限

权限应用

Permission

User Permission

Group Permission

权限检查

◆ Permission(一)

Django 定义每个 model 后,默认都会添加该 model 的 add, change 和 delete三个 permission,自定义的 permission 可以在我们定义 model 时手动添加

class Server(models.Model):

...

class Meta:

permissions = (

("view_server", "can view server"),

("change_server_status", "Can change the status of server"),

)

◆ Permission(二)

每个 permission 都是 django.contrib.auth.Permission 类型的实例,该类型包含三个字段 name, codename 和 content_type,

content_type 反应了 permission 属于哪个 model,

codename 如上面的 view_server,代码逻辑中检查权限时要用,

name 是 permission 的描述,将 permission 打印到屏幕或页面时默认显示的就是 name

◆ User Permission管理(一)

User 对象的 user_permission 字段管理用户的权限

user = User.objects.get(username="rock")

user.user_permissions = [permission_list]

user.user_permissions.add(permission, permission, …) #增加权限

user.user_permissions.remove(permission, permission, …) #删除权限

user.user_permissions.clear() #清空权限

注:上面的 permission 为 django.contrib.auth.Permission 类型的实例

# 示例演示:

In [3]: from django.contrib.auth.models import User #导入用户模块

In [6]: user = User.objects.get(username="nick") #获取用户对象

In [7]: user.user_permissions.all() # 查看用户权限

Out[7]: []

In [8]: from django.contrib.auth.models import Permission #导入权限模块

In [10]: Permission.objects.get(pk=43) #获取权限信息

Out[10]:

In [11]: Permission.objects.filter(pk=43) #获取权限信息(以列表形式输出)

Out[11]: []

In [12]: user.user_permissions = Permission.objects.filter(pk=43) #赋予用户权限(赋予权限不需要保存)

In [13]: user.user_permissions.all() #查看用户当前权限

Out[13]: []

In [18]: user.user_permissions.add(Permission.objects.get(pk=43)) #add添加权限(必须是一个Permission实例,否则报错)

In [40]: user.user_permissions.all()

Out[40]: [, ]

In [41]: user.user_permissions.remove(Permission.objects.get(pk=43)) #remove移除权限(必须是一个Permission实例,否则报错)

In [42]: user.user_permissions.all()

Out[42]: []

◆ User Permission 管理(二)

检查用户权限用 has_perm() 方法:

myuser.has_perm(’dashboard.view_server')

has_perm() 方法的参数,即 permission 的 codename,但传递参数时需要加上 model 所属 app 的前缀,无论 permission 赋予 user 还是 group,has_perm()方法均适用

列出用户的所有权限

user.get_all_permissions()

列出用户所属group的权限

user.get_group_permissions()

◆ Group Permission 管理

group permission 管理逻辑与 user permission 管理一致,group 中使用permissions 字段做权限管理:

group.permissions = [permission_list]

group.permissions.add(permission, permission, …)

group.permissions.remove(permission, permission, …)

group.permissions.clear()

◆ 权限验证(一)

在视图中验证权限—— permission_required

当业务逻辑中涉及到权限检查时,decorator 能够分离权限验证和核心的业务逻辑,使代码更简洁,逻辑更清晰。permission 的 decorator 为permission_required

from django.contrib.auth.decorators import permission_required

@permission_required(’dashboard.view_server')

def my_view(request):

...

◆ 权限验证(二)

在类视图中验证

from django.utils.decorators import method_decorator

from django.contrib.auth.decorators import login_required, permission_required

class ServerView(TemplateView):

@method_decorator(login_required)

@method_decorator(permission_required(“dashboard.view_server”)

def get(self, request, *args, **kwargs):

……

◆ 权限验证(三)

views 中验证

if not request.user.has_perm(’dashboard.view_server')

return HttpResponse('Forbidden')

◆ 权限验证(四)

Template 中的权限检查

{% if perms.dashboard.view_server %}

有权限

{% endif %}

◆ 扩展阅读:

Python 实战班第16期火热报名进行中

招生要求:

想往开发或者运维开发方向发展,Python 基础为零或薄弱,但能读懂 shell 或者其它任何一门语言的同学。

课程内容:

◆精简版 CMDB

1、html+css+js 多种前端技术结合

2、ajax 异步请求操作

3、分页搜索功能

4、常见数据库设计原则、CMDB 表结构实战、Mysql 实操

5、独立完项目、了解完整的 Web(LAMP) 架构

◆Nginx 日志统计分析与多维可视化

1、用 Python 处理 Nginx 日志文件,进行多维度数据统计分析

2、根据 ip、访问地址和访问状态等数据统计,统计结果存入数据库

3、Highcharts 等流行前端技术多维度,将分析结果可视化展示

◆快速构建实用监控系统

1、Python 读取机器的实时使用数据,通过 Http 请求将数据入库

2、设计数据入库的 API,收集不同机器的数据

3、前端将内存数据读出,视化展示折线图

4、独立完成项目,掌握 Python 常用的 time 等模块

咨询报名联系:

QQ(1):979950755 小月

QQ(2):279312229 ada

WeChat : 1902433859 小月

WeChat : 1251743084 小单

开课时间:9月9日



推荐阅读
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 深入解析 RuntimeClass 及多容器运行时应用
    本文旨在探讨RuntimeClass的起源、功能及其在多容器运行时环境中的实际应用。通过详细的案例分析,帮助读者理解如何在Kubernetes集群中高效管理不同类型的容器运行时。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
  • Python Selenium WebDriver 浏览器驱动详解与实践
    本文详细介绍了如何使用Python结合Selenium和unittest构建自动化测试框架,重点解析了WebDriver浏览器驱动的配置与使用方法,涵盖Chrome、Firefox、IE/Edge等主流浏览器。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文介绍如何通过Java代码调用阿里云短信服务API来实现短信验证码的发送功能,包括必要的依赖添加和关键代码示例。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • Django与Python及其他Web框架的对比
    本文详细介绍了Django与其他Python Web框架(如Flask和Tornado)的区别,并探讨了Django的基本使用方法及与其他语言(如PHP)的比较。 ... [详细]
  • 本文将介绍如何利用Python从西门子PLC获取数据,并通过Web技术实现数据的可视化。我们将探讨所需的技术栈和具体步骤。 ... [详细]
  • 深入解析Django CBV模型的源码运行机制
    本文详细探讨了Django CBV(Class-Based Views)模型的源码运行流程,通过具体的示例代码和详细的解释,帮助读者更好地理解和应用这一强大的功能。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
author-avatar
百变精灵621126
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有