Django默认权限机制介绍及实践
演示Django版本为当前最新版本v2.2
当Django配置文件中的INSTALL_APPS
包含了django.contrib.auth
时,就默认启用了一个简单的权限系统,提供了为用户或组分配权限的方法
之所以说简单呢?主要是因为:
- 默认的权限系统是基于表的控制,权限最小粒度是表
也就是说,假如有一个Blog表,我们可以赋予用户或组对Blog表有delete的权限,那么用户或组成员就可以删除全部Blog,是不能控制用户只能删除自己创建的blog的
如果希望用户只能删除自己创建的Blog,不能删除别人创建的Blog,这种需求Django默认的权限管理就无法实现了,需要用到object permission
对象权限,有第三方模块实现了对象权限,如django-guardian,你可以直接使用,或者也可以自己实现对象权限,具体思路可参考这篇文章:Django内置权限扩展案例
- 每个Model模型默认只有四个权限,分别是添加
add_
、修改change_
、删除delete_
、查看view_
,这些权限记录在Permission表中,表数据如下:
默认权限的创建是通过Django的信号signals实现的,使用了post_migrate
信号,在每次执行migrate操作时都会为新的Model模型创建默认权限,关于Django的信号Signals介绍和使用可以查看这篇文章:Django使用Signals监测model字段变化发送通知,
自定义权限
默认的权限名字和描述都是英文的,且只有四个,如果你不想用默认的几个权限,想要自定义的话,可以这样做:
class Blog(models.Model):
title = models.CharField(max_length=256, verbose_name='标题')
content = models.TextField(blank=True, null=True, verbose_name='内容')
class Meta:
default_permissions = ()
permissions = (
("change_blog", "修改博客"),
("delete_blog", "查看博客"),
("publish_blog", "发布博客"),
)
default_permissions: 清空默认的权限
permissions: 设置权限,内容是一个嵌套的列表,列表第一个字段是codename
,第二个字段为name
注意:如果你使用了django默认的admin的话,建议保留4个默认权限,可以添加新权限
权限修改
如果你用了Django自带的admin,在migrate之后就能在admin的user和group两个表中看到新添加的权限了
当然你也可以在程序中来添加或修改权限
用户权限修改方法:
ops = User.objects.get(id=2)
ops.user_permissions.add(25, 26)
ops.user_permissions.set([26, 27])
ops.user_permissions.remove(26, 27)
ops.user_permissions.clear()
组权限修改方法:
coffee = Group.objects.get(id=1)
coffee.permissions.add(25)
coffee.permissions.set([26,27])
coffee.permissions.remove(25)
coffee.permissions.clear()
其中add
为添加,set
为设置,remove
为移除,clear
为清空,add
跟set
的区别是add
会在原有权限的基础上加新权限,而set
会清空原有权限设置成新的权限,后边的参数25,26,27可以为Permission的ID或者是Permission对象,例如这样也是可以的:
p = Permission.objects.get(id=25)
coffee.permissions.add(p)
给组赋予权限,组内的所有用户会自动的拥有该组的权限,例如用户ops-coffee
隶属于组SRE
,SRE
组对Blog表有修改权限,那么即便是没有单独给Y37
用户分配任何权限,他也会有对Blog表的修改权限
权限查看
get_all_permissions()
列出用户的所有权限:
>>> User.objects.get(username='ops-coffee').get_all_permissions()
{'blog.publish_blog', 'blog.delete_blog', 'auth.add_group', 'blog.change_blog'}
get_group_permissions()
列出用户所属组的权限:
>>> User.objects.get(username='ops-coffee').get_group_permissions()
{'blog.publish_blog', 'blog.change_blog', 'blog.delete_blog'}
权限校验
用户对象可以通过has_perm
方法来判断用户是否拥有某个权限:
>>> User.objects.get(username='ops-coffee').has_perm('blog.change_blog')
True
>>> User.objects.get(username='ops-coffee').has_perm('blog.delete_blog')
True
has_perm 的参数由<app label>.<permission codename>
两部分组成,例如blog.delete_blog
表示的就是名字为blog
的APP下的delete_blog
权限
后端View校验权限
可以直接在view中通过if判断用户权限,例如:
def ops_coffee_view(request):
if not request.user.has_perm('blog.change_blog')
return HttpResponse('403 Forbidden')
为了方便,Django还提供了一个permission_required()
的装饰器,可以快速的来校验用户是否拥有特定的权限,用法如下:
@permission_required(perm, login_url=None, raise_exception=False)
三个参数的意思分别是:
perm: 必须有,权限名称,同has_perm
一样
login_url: 非必须,登陆的url地址,当你没有权限时自动跳转到登陆页,这里可以设置登陆地址的url
reise_exception: 非必须,当为True时,如果用户没有权限,则不会跳转到登陆页,而是引发PermissionDenied
错误,返回403 Forbidden
如下例子,判断用户是否有blog
的APP的change_blog
权限,如果没有则返回403错误
@permission_required('blog.change_blog', raise_exception=True)
def ops_coffee_view(request):
...
前端Template中校验权限
当前登陆用户的权限保存在模版变量{{ perms }}
中,可以在模版中通过if判断用户是否拥有相应的权限而开放对应的内容,例如对于侧边栏菜单只显示用户有权限访问的,就可以这么写:
{% if perms.cmdb.view_project %}
<li><a href="{% url 'project-list-url' %}"></i> 项目列表</a></li>
{% endif %}
{% if perms.cmdb.view_service %}
<li><a href="{% url 'service-list-url' %}"></i> 服务列表</a></li>
{% endif %}
{% if perms.cmdb.view_environment %}
<li><a href="{% url 'environment-list-url' %}"></i> 环境列表</a></li>
{% endif %}
至此,Django的默认权限系统介绍完成,默认权限在小型项目中能满足大部分的需求,如果对权限控制有更高的要求可以关注前文中介绍的django-guardian
项目或自己实现
相关文章推荐阅读:
Django默认权限机制介绍及实践的更多相关文章
- Django权限机制的实现
Django权限机制的实现 1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发 ...
- django自带权限机制
1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是 ...
- python 学习笔记十八 django深入学习三 分页,自定义标签,权限机制
django Pagination(分页) django 自带的分页功能非常强大,我们来看一个简单的练习示例: #导入Paginator>>> from django.core.p ...
- 理解Linux文档的默认安全机制、隐藏属性、特殊权限,妈妈在也不用担心你从删库到跑路!!!
写在前面 前面的章节 详解Linux文档属性.拥有者.群组.权限.差异,介绍了文档的基本权限,包括读写执行(r,w,x),还有文档若干的属性,包括是否为目录(d).文件(-).链接文件(l).拥有者. ...
- Django-开放静态资源-获取请求携带的数据-pychram连接数据库-修改Django默认数据库-DjangoORM操作--表管理-记录管理-01
目录 关于静态资源访问 为什么要配置静态文件才能获取静态资源 常见的静态文件种类 如何配置来开启访问权限 禁用浏览器缓存 django的自动重启机制(热启动) 静态文件接口动态解析 向服务器发送数据 ...
- Android权限管理之Permission权限机制及使用
前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...
- Salesforce的数据权限机制
本文主要介绍了 Salesforce 对于系统中数据的访问控制是如何设计的,然后也了解了下 Alfresco 和 Oracle VPD 的数据权限机制.希望对一些业务系统的数据权限的访问控制设计能有所 ...
- [转载]再谈PostgreSQL的膨胀和vacuum机制及最佳实践
本文转载自 www.postgres.cn 下的文章: 再谈PostgreSQL的膨胀和vacuum机制及最佳实践http://www.postgres.cn/news/viewone/1/390 还 ...
- RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践
RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...
随机推荐
- Codefroces 366 D Dima and Trap Graph (最短路)
Dima and Trap Graph 题意:Dima和Inna越来越喜欢对方,但是Dima的室友缺很没有热情出去玩,然后Dima就把他室友Seryozha骗进了陷阱里.现在Seryozha想要从陷阱 ...
- codeforces 813 D. Two Melodies(dp)
题目链接:http://codeforces.com/contest/813/problem/D 题意:求两个不相交的子集长度之和最大是多少,能放入同一子集的条件是首先顺序不能变,然后每一个相邻的要么 ...
- codeforces 755D. PolandBall and Polygon(线段树+思维)
题目链接:http://codeforces.com/contest/755/problem/D 题意:一个n边形,从1号点开始,每次走到x+k的位置如果x+k>n则到x+k-n的位置,问每次留 ...
- poj 1511 Invitation Cards(dijstra优化)
题目链接:http://poj.org/problem?id=1511 题意:给出n个点和n条有向边,求所有点到源点1的来回最短路之和(保证每个点都可以往返源点1) 题目比较简单就是边和点的个数有点多 ...
- js jQuery显示隐藏div的几种方法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_36135335/article/d ...
- webpack,vue中定义的别名怎么在模板, css sass less的图片地址上使用
webpack 的别名好处大家也都了解, 但是 vue 的模板中, 对图片地址使用别名时总出现问题, 很久时间的时间都没找到解决办法, 一度认为是 webpack 的原因... alias: { 's ...
- Zabbix面试总结
zabbix官方的一句话描述zabbix: 监视任何事情适用于任何IT基础架构,服务,应用程序和资源的解决方案 Monitor anythingSolutions for any kind of IT ...
- 如何在IDEA中导入一个普通的java工程
1.如下: 2.如下,选中要导入的工程: 3.如下: 4.如下图 5.点击next,后如下图: 6.点击next后,如下图: 7.点击next后,如下图: 8.点击next后,如下图: 9.点击nex ...
- [Vue 牛刀小试]:第十七章 - 优化 Vue CLI 3 构建的前端项目模板(1)- 基础项目模板介绍
一.前言 在上一章中,我们开始通过 Vue CLI 去搭建属于自己的前端 Vue 项目模板,就像我们 .NET 程序员在使用 asp.net core 时一样,我们更多的会在框架基础上按照自己的开发习 ...
- SpringBoot 2.0 + Nacos + Sentinel 流控规则集中存储
前言 Sentinel 原生版本的规则管理通过API 将规则推送至客户端并直接更新到内存中,并不能直接用于生产环境.不过官方也提供了一种 Push模式,扩展读数据源ReadableDataSource ...