Permission的用法

  • 前言
  • 默认的权限(add, change, delete, view)
  • 使用方法
    • 在函数中验证权限,使用user.has_perm
    • 验证函数是否有执行权限,使用@permission_required
    • 在template上使用权限验证
  • 自定义权限

前言

一些公司内部的CMS系统存在某些内容让指定的用户有权限访问,这时候可以用django自带的权限管理进行限制,比较方便。

缺点:django自带的权限是针对model(模型)的,不能针对单条数据,要针对单条数据需要额外的操作。

默认的权限(add, change, delete, view)

django针对每个模型,生成了四个默认的权限(add, change, delete, view)。例如,我有一个modelLog,那么这四个默认权限在数据库的存储格式为:

auth_permission注:id字段的值是随便取的,使用python manage.py migrate的时候会自动生成

id name content_type_id codename
1 Can add log 7 add_log
2 Can change log 7 change_log
3 Can delete log 7 delete_log
4 Can view log 7 view_log

字段解释
id:自动生成的
name: 描述权限的的内容,无太大的实际作用
content_type_id:与django_content_type中的id字段对应
codename:权限表示值,换句话说用add_log来表示用户对Log模型有新增权限。验证权限的时候就是验证这个值

那如果我的模型叫Student呢,把上面表中的log替换成student就行了。

name字段中Can add xxCan change xx等都是固定的,只有xx是根据模型来的。

同理,codename字段也是一样,add_xxxchange_xxx

auth_permission表中content_type_id字段还没有解释,先来看下面这张表:

django_content_type

id app_label model
1 admin logentry
3 auth group
2 auth permission
4 auth user
5 contenttypes contenttype
6 sessions session
7 test log

字段解释
id:自增字段;auth_permission表的content_type_id字段就对应这个值
app_label:属于哪个app包,上面的Log就是test app下的模型
model:模型名字

使用方法

在函数中验证权限,使用user.has_perm

例如:我们有一个书店,有普通员工A(model User),现在需要去出版社订购一批书(model Book),我们判断这个人是否有权利添加(add_book)书籍。

user = User.objects.get(username='A')
# has_permission是一个boolean,因为Book模型是放在test app下面的
has_permission = user.has_perm('test.add_book')

为什么验证权限的时候前面要加app名,很好理解啊,不同app有同样名字的权限,到底是验证哪个呢?

验证函数是否有执行权限,使用@permission_required

@permission_required
def function():pass

permission_required有三个参数:

  • perm,描述权限的字符串,格式为:app名.权限。如"auth.add_user",“auth.delete_user
  • login_url,如果没有权限需要跳转的url字符串,如"/login",“https://www.baidu.com”
  • raise_exception,boolean值,没有权限是否触发PermissionDenied异常,触发异常则直接返回,不会跳转到login_url指向的地址

在template上使用权限验证

  • 第一种写法

    首先,我们需要在app的根目录下创建一个名为templatetags的包(IDEA会自动在包下创建__init__文件),接着在包里面创建一个文件my_tags.py,在my_tags.py里面定义一个过滤器has_permission,使用这个滤器对用户进行权限验证,它接收两个参数:

    • user,当前登录的用户对象
    • perm,需要验证的权限字符串
    from django import templateregister = template.Library()@register.filter
    def has_permisstion(user, perm):if user:return user.has_perm(perm)return False
    

    接着,我们创建一个名为index.html的模板页面,一定要记得加载标签文件{% load my_tags %}

    <!DOCTYPE html>
    {% load my_tags %}
    <html lang="en">
    <head><meta charset="UTF-8"><title>首页</title>
    </head>
    <body>
    <p>后面的内容只有有权限的人才能看到,{% if request.user|has_permisstion:'test.add_department' %}我有权限{% endif %}
    </p>
    </body>
    </html>
    

    目录结构:

    演示结果,我已经登录过了,并且有权限了:

  • 第二种写法
    使用模板里面的全局变量perms,例如perms.test.add_department

    {% if perms.应用名.权限标识 %}<!-- 这里是有权限才显示的内容 -->
    {% endif %}
    

    第二种写法,引用自:https://www.cnblogs.com/i969639/p/11201257.html

自定义权限

首先,我在test app的model文件中建立了一个Department模型,然后给他增加了一个自定义权限。

class Department(models.Model):name = models.CharField(null=True, max_length=20)user = models.ManyToManyField(User)one_user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='one_user')class Meta:# permissions是一个元组,记得每组权限后面加逗号,下面是一组权限permissions = (# (权限,权限描述),('customize_permission', 'This is my customize permission'),)

执行下面语句进行数据库同步修改:

python manage.py makemigrations
python manage.py migrate

系统输出,说明增加成功

>> Migrations for 'test':test\migrations\0003_auto_20200407_1645.py- Change Meta options on department

打开数据库验证,成功。

然后,我们就能像前面一样使用customize_permission这个权限了。

django自带的权限管理Permission用法相关推荐

  1. python在人工智能应用锁_饮冰三年-人工智能-Python-35权限管理(万能的权限通用模块)...

    自定义权限认证 1:修改model.py类.主要是添加两个class from django.db importmodelsfrom django.contrib.auth.models import ...

  2. 基于Django实现RBAC权限管理

    概述 RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后给用户划分角色.在web应用中,可以将权限理解为url,一个权限对应一个url. 在实际 ...

  3. django认证系统实现自定义权限管理的方法 - python

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 本文记录使用django自带的认证系统实现自定义的权限管理系统,包含组权限.用户权限等实现. 0x01. django认 ...

  4. Django 权限管理-后台根据用户权限动态生成菜单

    Django权限管理 实现目标: 1.管理用户,添加角色,用户关联角色 2.添加权限.角色关联权限 3.添加动作.权限关联动作 4.添加菜单.权限关联菜单 实现动态生成用户权限菜单(可设置多级菜单嵌套 ...

  5. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  6. cognos java用户权限_Cognos 权限管理之第三方目录管理员器、报表服务器权限管理、FrameWork权限管理等详细配置 【39页深度好文图文并茂带你全面了解Cognos权限管理】...

    一.引言 1.1. 编写目的 本文档是结合以往的开发经验,从实际报表开发出发,详细介绍了ReportNet报表设计流程.开发技巧,报表性能调优.FM建模规范及技巧讲解.总结的文档希望对大家在日后的开发 ...

  7. django权限管理

    当我们为应用创建一个Models, 在同步到数据库里,django默认给了三个权限 ,就是 add, change, delete权限. 首先,我们创建一个perm_test的project, 然后再 ...

  8. django权限系统实现步骤_在django中实现一个简单的权限管理

    首先在models.py里先加入我们需要的表 Meta里的参数自己定义,我这里定义了3个,作为我的权限分类,定义好之后我们可以在django-admin里看到我们的权限分类,当我们添加用户的时候也可以 ...

  9. Permission权限管理——隐私权限具体说明

    文章目录 1.应用场景 2.实际效果 3.权限申请 1. PermissionDialogUtil类 2. PermissionUtils类 3. 具体调用 4.权限管理 5.项目地址 1.应用场景 ...

最新文章

  1. linux共享存储通信实验,Linux进程通信——共享存储
  2. css设置背景图片缩小,css3 设置背景图片大小(缩略图形式缩小)
  3. zookeeper启动后没有相关进程
  4. 【转】!Dynamics 365 Online通过OAuth 2 Client Credential授权(Server-to-Server Authentication)后调用Web API
  5. WSFC真实场景仲裁处理
  6. 【Git】处理 Unable to access ‘https://github.com’: OpenSSL SSL_read: Connection was reset, errno 10054
  7. 图标X轴this显示值自定义
  8. synchronized互斥锁结合wait()、notify()方法使用,实现线程的阻塞以及线程调用案例
  9. 公共邮箱,共享邮箱,免费邮箱,匿名邮箱,临时邮箱,免费收信
  10. plsql导出表结构到excel_PLSQL怎样导出oracle表结构和数据
  11. Winform实现简单的记住用户名密码功能
  12. linux系统安装word,如何在Linux中安装FreeOffice 2018
  13. 有吧友需要PDF的下载站点,好吧,我这边汇总一下
  14. UVM——Sequencer Driver
  15. exadata的infiniband交换机的ilom
  16. Java中File使用--创建文件
  17. 无情,才是世上最远的距离!
  18. 读书笔记---Head First 设计模式--- 装饰者模式
  19. ServiceMesh实践与探索
  20. 关于“IT学子成长指导”专栏及文章目录

热门文章

  1. JDBC - MySQL
  2. *2-1 OJ 254 翻煎饼
  3. 华为鸿蒙2.0如何安装谷歌服务框架
  4. python 的 do ~ while 语法
  5. Thinkpad w530 换内存视频教程
  6. 广东省计算机一级网络题分值,2018年一级计算机等级考试题型和分值
  7. 2020李宏毅机器学习笔记-Anomaly Detection
  8. MS2109/HDMI转USB2.0高清视频采集
  9. SwiftUI嵌入Stack样式导航视图(NavigationView)中List显示怪异的解决
  10. 性能指标:队列深度、IOPS与时延