前言
一些公司内部的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 template register = 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 %}
自定义权限
首先,我在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用法说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
今天我们会介绍一下 Django 中的自带的权限机制,并用一个案例帮助大家理解相关的权限用法。 1. Django 中自带的权限机制 当 Django 配置文件中的 INSTALL_APPS 包含了 django.contrib.auth 时,就默认启用了一个简单的权限系统,提供了为用户或组分配权限的方法。这个自带的权限系统是基于表的控制,权限最小粒度是表。也就是说,Django 的权限系统将控制
之前讲了单个账户的权限的增、删、改、查及一系列操作,并没有讲到权限的使用,那么如果我们增加一个权限,但是不会用它,那又有什么意义呢? 所以,今天就来学习一下权限的使用。 说明: 本教程,通过eosio.token合约的transfer来进行演示。 目录 创建eosio.token并发放eosio.token合约 创建测试账号eostea 测试账号eostea发放代币 测试账号转账给账号hello
权限管理 权限管理机制是 hyperledger fabric 项目的一大特色。下面给出使用权限管理的一个应用案例。 启动集群 首先下载相关镜像。 $ docker pull yeasy/hyperledger:latest $ docker tag yeasy/hyperledger:latest hyperledger/fabric-baseimage:latest $ docker pull
添加 找到一个你要添加的位置“右击” 在弹出的下拉选项中选择“添加同级”或“添加下级” 在弹出的对话框输入相关信息 路由名称 路由路径,支持 /app/{namespace}/{id:+0~9} 或 /app/:namespace/:id 两种写法 Icon: 如果是菜单填ant.design支持的icon就行 HTTP请求的Method,支持 GET、POST、DELETE、PUT等 是否是菜单
细节 一个文件主要包含下列属性,ls -l - rwxrwxrwx user group date filename 111 101 101 归属用户的权限 归属群组的权限 其它用户的权限 归属用户 归属群组 日期信息 文件名称 对于文件夹,必须拥有它的可执行权限,才能够使用 cd 命令进入该文件夹;拥有可读权限,才能够使用 ls 命令查看该文件夹的文件列表。 root用户
Django 给我们提供了一个内置的完整功能的管理页面。在这个管理页面,我们可以对实现的模型对象进行完整的增删改查操作,足以满足我们的日常需求,接下来开始进入这个管理工具的使用。 1. 初识 Admin Web 首先 Django 工程中默认自带 Admin 管理工具并作为内置应用在 settings.py 中的 INSTALLED_APPS 上进行了注册: INSTALLED_APPS = [