django自带的权限管理Permission用法
Permission的用法
- 前言
- 默认的权限(add, change, delete, view)
- 使用方法
- 在函数中验证权限,使用user.has_perm
- 验证函数是否有执行权限,使用@permission_required
- 在template上使用权限验证
- 自定义权限
前言
一些公司内部的CMS系统存在某些内容让指定的用户有权限访问,这时候可以用django自带的权限管理进行限制,比较方便。
缺点:django自带的权限是针对model(模型)的,不能针对单条数据,要针对单条数据需要额外的操作。
默认的权限(add, change, delete, view)
django针对每个模型,生成了四个默认的权限(add, change, delete, view)。例如,我有一个model
叫Log
,那么这四个默认权限在数据库的存储格式为:
表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 xx
,Can change xx
等都是固定的,只有xx
是根据模型来的。
同理,codename
字段也是一样,add_xxx
,change_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用法相关推荐
- python在人工智能应用锁_饮冰三年-人工智能-Python-35权限管理(万能的权限通用模块)...
自定义权限认证 1:修改model.py类.主要是添加两个class from django.db importmodelsfrom django.contrib.auth.models import ...
- 基于Django实现RBAC权限管理
概述 RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后给用户划分角色.在web应用中,可以将权限理解为url,一个权限对应一个url. 在实际 ...
- django认证系统实现自定义权限管理的方法 - python
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 本文记录使用django自带的认证系统实现自定义的权限管理系统,包含组权限.用户权限等实现. 0x01. django认 ...
- Django 权限管理-后台根据用户权限动态生成菜单
Django权限管理 实现目标: 1.管理用户,添加角色,用户关联角色 2.添加权限.角色关联权限 3.添加动作.权限关联动作 4.添加菜单.权限关联菜单 实现动态生成用户权限菜单(可设置多级菜单嵌套 ...
- Android权限管理之Permission权限机制及使用
前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...
- cognos java用户权限_Cognos 权限管理之第三方目录管理员器、报表服务器权限管理、FrameWork权限管理等详细配置 【39页深度好文图文并茂带你全面了解Cognos权限管理】...
一.引言 1.1. 编写目的 本文档是结合以往的开发经验,从实际报表开发出发,详细介绍了ReportNet报表设计流程.开发技巧,报表性能调优.FM建模规范及技巧讲解.总结的文档希望对大家在日后的开发 ...
- django权限管理
当我们为应用创建一个Models, 在同步到数据库里,django默认给了三个权限 ,就是 add, change, delete权限. 首先,我们创建一个perm_test的project, 然后再 ...
- django权限系统实现步骤_在django中实现一个简单的权限管理
首先在models.py里先加入我们需要的表 Meta里的参数自己定义,我这里定义了3个,作为我的权限分类,定义好之后我们可以在django-admin里看到我们的权限分类,当我们添加用户的时候也可以 ...
- Permission权限管理——隐私权限具体说明
文章目录 1.应用场景 2.实际效果 3.权限申请 1. PermissionDialogUtil类 2. PermissionUtils类 3. 具体调用 4.权限管理 5.项目地址 1.应用场景 ...
最新文章
- linux共享存储通信实验,Linux进程通信——共享存储
- css设置背景图片缩小,css3 设置背景图片大小(缩略图形式缩小)
- zookeeper启动后没有相关进程
- 【转】!Dynamics 365 Online通过OAuth 2 Client Credential授权(Server-to-Server Authentication)后调用Web API
- WSFC真实场景仲裁处理
- 【Git】处理 Unable to access ‘https://github.com’: OpenSSL SSL_read: Connection was reset, errno 10054
- 图标X轴this显示值自定义
- synchronized互斥锁结合wait()、notify()方法使用,实现线程的阻塞以及线程调用案例
- 公共邮箱,共享邮箱,免费邮箱,匿名邮箱,临时邮箱,免费收信
- plsql导出表结构到excel_PLSQL怎样导出oracle表结构和数据
- Winform实现简单的记住用户名密码功能
- linux系统安装word,如何在Linux中安装FreeOffice 2018
- 有吧友需要PDF的下载站点,好吧,我这边汇总一下
- UVM——Sequencer Driver
- exadata的infiniband交换机的ilom
- Java中File使用--创建文件
- 无情,才是世上最远的距离!
- 读书笔记---Head First 设计模式--- 装饰者模式
- ServiceMesh实践与探索
- 关于“IT学子成长指导”专栏及文章目录