django自带的权限管理Permission用法说明

作者:C丶卡萝尔 时间:2023-07-25 04:18:06 

前言

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

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

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

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

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

idnamecontent_type_idcodename
1Can add log7add_log
2Can change log7change_log
3Can delete log7delete_log
4Can view log7view_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

idapp_labelmodel
1adminlogentry
3authgroup
2authpermission
4authuser
5contenttypescontenttype
6sessionssession
7testlog

字段解释

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>

目录结构:

django自带的权限管理Permission用法说明

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

django自带的权限管理Permission用法说明

第二种写法

使用模板里面的全局变量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

打开数据库验证,成功。

django自带的权限管理Permission用法说明

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

来源:https://blog.csdn.net/u012790802/article/details/105297928

标签:django,权限,Permission
0
投稿

猜你喜欢

  • 微信小程序 详解下拉加载与上拉刷新实现方法

    2024-04-23 09:31:09
  • MySQL 数据类型选择原则

    2024-01-21 03:02:42
  • python的pstuil模块使用方法总结

    2022-10-09 22:47:16
  • 使用Python更换外网IP的方法

    2021-01-25 04:25:46
  • 谈谈图片如何影响转换率

    2011-08-10 19:14:08
  • vue3的watch用法以及和vue2中watch的区别

    2024-04-30 08:42:37
  • javascript下兼容firefox选取textarea文本的代码

    2013-08-30 02:05:16
  • asp任何连接带密码的access数据库

    2008-04-29 21:36:00
  • Golang使用Gin框架实现路由分类处理请求流程详解

    2024-05-29 22:07:41
  • 基于python实现高速视频传输程序

    2022-04-01 02:14:17
  • 微软建议的ASP性能优化28条守则(1)

    2008-02-22 16:54:00
  • python 匹配url中是否存在IP地址的方法

    2023-04-13 14:29:08
  • 自动在Windows中运行Python脚本并定时触发功能实现

    2023-04-15 21:12:38
  • golang之数组切片的具体用法

    2024-04-29 13:06:43
  • ThinkPHP中自定义错误页面和提示页面实例

    2024-05-02 17:16:21
  • python opencv画局部放大图实例教程

    2023-12-01 09:55:55
  • Python+Selenium实现自动化的环境搭建的步骤(图文)

    2022-02-23 23:59:33
  • Golang信号处理及如何实现进程的优雅退出详解

    2024-05-28 15:24:29
  • javascript 精确获取样式属性(上)

    2024-04-17 09:45:37
  • 详解Python:面向对象编程

    2023-10-26 16:17:53
  • asp之家 网络编程 m.aspxhome.com