专栏首页菲宇Django默认权限机制及使用

Django默认权限机制及使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/bbwangj/article/details/102613450

当Django配置文件中的INSTALL_APPS包含了django.contrib.auth时,就启用了默认的权限系统,提供了为用户或组分配权限的方法

1、 默认的权限系统是基于表的控制,权限最小粒度是表 假如有一个Blog表,我们可以赋予用户或组对Blog表有delete的权限,那么用户或组成员就可以删除全部Blog,是不能控制用户只能删除自己创建的blog的 如果希望用户只能删除自己创建的Blog,不能删除别人创建的Blog,这种需求Django默认的权限管理就无法实现了,需要用到object permission对象权限,有第三方模块实现了对象权限,如django-guardian 2、 每个Model模型默认只有四个权限,分别是添加add_、修改change_、删除delete_、查看view_,这些权限记录在Permission表中,表数据如下: 默认权限的创建是通过Django的信号signals实现的,使用了post_migrate信号,在每次执行migrate操作时都会为新的Model模型创建默认权限,关于Django的信号Signals介绍和使用可以查看这篇文章:Django使用Signals监测model字段变化发送通知, 3、自定义权限 默认的权限名字和描述都是英文的,且只有四个,如果你不想用默认的几个权限,想要自定义的话,可以这样做: 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个默认权限,可以添加新权限 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表的修改权限 5、权限查看 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'} 6、权限校验 用户对象可以通过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权限 7、后端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): ... 8、前端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 %}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用Centrifuge平台检测固件漏洞

    最近,针对TP-Link WL-WA850RE WiFi Range Extender 发布的漏洞引起了我们的注意,并对其进行了进一步调查。对于许多低成本的消费...

    安恒网络空间安全讲武堂
  • 【Rust日报】2019-09-25 Nushell 0.3.0 发布

    Nushell(简称Nu)是一种新型的shell,它采用现代的结构化方法来处理命令行。它与来自文件系统、操作系统和越来越多的文件格式的数据无缝地工作,使构建强大...

    MikeLoveRust
  • 一文搞懂各大APP&网站python网络爬虫

    很久以前写了一篇爬虫的文章,把它放在CSDN上(livan1234)没想到点击量竟然暴涨,足以看到大家在数据获取方面的需求,爬虫技术现在已经非常普遍,其用途也非...

    数据森麟
  • 最新新浪短网址(t.cn)生成API接口

    许坏
  • 为什么大部分的码农都做不了架构师?

    一般来说技术团队的金字塔顶尖往往是技术最牛的人做架构师(或TL)。所以架构师在广大码农中的占比大概平均不到 20%。

    数据森麟
  • ThinkPHP 5.1.x~5.2.x全版本 RCE 漏洞分析

    大概看了下,这个洞跟5.0的原理大致相同,都是利用Reuqest类的Method方法覆盖了 $this->filter属性,然后进入 filterValue调用...

    安恒网络空间安全讲武堂
  • python---爬取英雄联盟皮肤图片

    爬LOL的皮肤高清图片的大致步骤就是用selenium去爬取英雄联盟所以英雄的皮肤的url地址,然后在用requests库去将图片下载到本地。

    sjw1998
  • Python批量下载无版权图片

    生活或者工作中,不管是写文章、公司 UI 交互图还是广告图等等都需要用到图片,图片的优点和重要性自不用说。

    数据森麟
  • 2000万条直播数据,揭秘斗鱼主播生存现状

    本文转载自凹凸玩数据 2019年7月17日游戏直播平台斗鱼在美国纳斯达克股票交易所成功上市,成为继虎牙直播之后第二家赴美上市的国内直播平台。

    数据森麟
  • 使用 Docker 和 Traefik 搭建 Flarum 轻论坛应用

    本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

    soulteary

扫码关注云+社区

领取腾讯云代金券