django自带的权限管理Permission用法

本文介绍了Django自带的权限管理系统,包括默认的add、change、delete、view权限,以及如何在函数、视图和模板中验证权限。同时,文章详细展示了如何自定义权限,并通过数据库操作和实例应用进行演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

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

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

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

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 xxCan change xx等都是固定的,只有xx是根据模型来的。

同理,codename字段也是一样,add_xxxchange_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>
    

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

  • 第二种写法
    使用模板里面的全局变量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这个权限了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值