Django默认权限机制介绍及实践

演示Django版本为当前最新版本v2.2

当Django配置文件中的INSTALL_APPS包含了django.contrib.auth时,就默认启用了一个简单的权限系统,提供了为用户或组分配权限的方法

之所以说简单呢?主要是因为:

  1. 默认的权限系统是基于表的控制,权限最小粒度是表

也就是说,假如有一个Blog表,我们可以赋予用户或组对Blog表有delete的权限,那么用户或组成员就可以删除全部Blog,是不能控制用户只能删除自己创建的blog的

如果希望用户只能删除自己创建的Blog,不能删除别人创建的Blog,这种需求Django默认的权限管理就无法实现了,需要用到object permission对象权限,有第三方模块实现了对象权限,如django-guardian,你可以直接使用,或者也可以自己实现对象权限,具体思路可参考这篇文章:Django内置权限扩展案例

  1. 每个Model模型默认只有四个权限,分别是添加add_、修改change_、删除delete_、查看view_,这些权限记录在Permission表中,表数据如下:

默认权限的创建是通过Django的信号signals实现的,使用了post_migrate信号,在每次执行migrate操作时都会为新的Model模型创建默认权限,关于Django的信号Signals介绍和使用可以查看这篇文章:Django使用Signals监测model字段变化发送通知

自定义权限

默认的权限名字和描述都是英文的,且只有四个,如果你不想用默认的几个权限,想要自定义的话,可以这样做:

class Blog(models.Model):
    title = models.CharField(max_length=256, verbose_name='标题')
    content = models.TextField(blank=True, null=True, verbose_name='内容')

    class Meta:
        default_permissions = ()

        permissions = (
            ("change_blog", "修改博客"),
            ("delete_blog", "查看博客"),
            ("publish_blog", "发布博客"),
        )

default_permissions: 清空默认的权限

permissions: 设置权限,内容是一个嵌套的列表,列表第一个字段是codename,第二个字段为name

注意:如果你使用了django默认的admin的话,建议保留4个默认权限,可以添加新权限

权限修改

如果你用了Django自带的admin,在migrate之后就能在admin的user和group两个表中看到新添加的权限了

当然你也可以在程序中来添加或修改权限

用户权限修改方法:

ops = User.objects.get(id=2)

ops.user_permissions.add(25, 26)
ops.user_permissions.set([26, 27])
ops.user_permissions.remove(26, 27)
ops.user_permissions.clear()

组权限修改方法:

coffee = Group.objects.get(id=1)

coffee.permissions.add(25)
coffee.permissions.set([26,27])
coffee.permissions.remove(25)
coffee.permissions.clear()

其中add为添加,set为设置,remove为移除,clear为清空,addset的区别是add会在原有权限的基础上加新权限,而set会清空原有权限设置成新的权限,后边的参数25,26,27可以为Permission的ID或者是Permission对象,例如这样也是可以的:

p = Permission.objects.get(id=25)
coffee.permissions.add(p)

给组赋予权限,组内的所有用户会自动的拥有该组的权限,例如用户ops-coffee隶属于组SRESRE组对Blog表有修改权限,那么即便是没有单独给Y37用户分配任何权限,他也会有对Blog表的修改权限

权限查看

get_all_permissions()列出用户的所有权限:

>>> User.objects.get(username='ops-coffee').get_all_permissions()
{'blog.publish_blog', 'blog.delete_blog', 'auth.add_group', 'blog.change_blog'}

get_group_permissions()列出用户所属组的权限:

>>> User.objects.get(username='ops-coffee').get_group_permissions()
{'blog.publish_blog', 'blog.change_blog', 'blog.delete_blog'}

权限校验

用户对象可以通过has_perm方法来判断用户是否拥有某个权限:

>>> User.objects.get(username='ops-coffee').has_perm('blog.change_blog')
True
>>> User.objects.get(username='ops-coffee').has_perm('blog.delete_blog')
True

has_perm 的参数由<app label>.<permission codename>两部分组成,例如blog.delete_blog表示的就是名字为blog的APP下的delete_blog权限

后端View校验权限

可以直接在view中通过if判断用户权限,例如:

def ops_coffee_view(request):
    if not request.user.has_perm('blog.change_blog')
        return HttpResponse('403 Forbidden')

为了方便,Django还提供了一个permission_required()的装饰器,可以快速的来校验用户是否拥有特定的权限,用法如下:

@permission_required(perm, login_url=None, raise_exception=False)

三个参数的意思分别是:

perm: 必须有,权限名称,同has_perm一样

login_url: 非必须,登陆的url地址,当你没有权限时自动跳转到登陆页,这里可以设置登陆地址的url

reise_exception: 非必须,当为True时,如果用户没有权限,则不会跳转到登陆页,而是引发PermissionDenied错误,返回403 Forbidden

如下例子,判断用户是否有blog的APP的change_blog权限,如果没有则返回403错误

@permission_required('blog.change_blog', raise_exception=True)
def ops_coffee_view(request):
    ...

前端Template中校验权限

当前登陆用户的权限保存在模版变量{{ perms }}中,可以在模版中通过if判断用户是否拥有相应的权限而开放对应的内容,例如对于侧边栏菜单只显示用户有权限访问的,就可以这么写:

{% if perms.cmdb.view_project %}
    <li><a href="{% url 'project-list-url' %}"></i> 项目列表</a></li>
{% endif %}

{% if perms.cmdb.view_service %}
    <li><a href="{% url 'service-list-url' %}"></i> 服务列表</a></li>
{% endif %}

{% if perms.cmdb.view_environment %}
    <li><a href="{% url 'environment-list-url' %}"></i> 环境列表</a></li>
{% endif %}

至此,Django的默认权限系统介绍完成,默认权限在小型项目中能满足大部分的需求,如果对权限控制有更高的要求可以关注前文中介绍的django-guardian项目或自己实现



相关文章推荐阅读:

原文地址:https://www.cnblogs.com/37Y37/p/11658651.html

时间: 2024-10-06 11:00:05

Django默认权限机制介绍及实践的相关文章

&#8203;Linux文件和目录特殊权限位介绍及实践&#8203;(setuid setgid)

            Linux文件和目录特殊权限位介绍及实践 在Linux中不管是超级用户root还是普通用户都可以使用命令"passwd"命令修改自己的密码,但是了解Linux的人都知道Linux密码是存放在/etc/passwd  /etc/shadow  里面的 用ls -l /etc/passwd  /etc/shadow 查看一下权限 [[email protected] ~]# ls -l /etc/passwd /etc/shadow -rw-r--r--. 1 ro

django权限机制

1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是非常必要的. 1.1 Django的权限控制 Django用user, group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局 的权限,即如果用户A对数据模型(model)B有可写权限,那么A能修改model

django自带权限机制

1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是非常必要的. 1.1 Django的权限控制 Django用user, group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局的权限,即如果用户A对数据模型(model)B有可写权限,那么A能修改model B

django 权限机制

1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是非常必要的. 1.1 Django的权限控制 Django用user, group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局的权限,即如果用户A对数据模型(model)B有可写权限,那么A能修改model B

Django权限机制概述

1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是非常必要的. 1.1 Django的权限控制 Django用user, group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局的权限,即如果用户A对数据模型(model)B有可写权限,那么A能修改model B

android权限机制,你真的了解么

android权限机制,你真的了解么 一.Android的权限机制 Android是目前最流行的智能手机软件平台之一,在智能移动终端如火如荼发展的同时,其安全态势也日益严峻.有调查表明,恶意软件的数量在持续的上升,Google在Android安全机制上面也做了很多工作,并且一直在持续的更新,其Android的安全模型由3个部分组成:Linux安全机制.Android本地库及运行环境安全与Android特有的安全机制,如下图: 本文只涉及到其中的权限机制介绍,其他的部分如果有感兴趣的,我们可以后续

理解Linux文档的默认安全机制、隐藏属性、特殊权限,妈妈在也不用担心你从删库到跑路!!!

写在前面 前面的章节 详解Linux文档属性.拥有者.群组.权限.差异,介绍了文档的基本权限,包括读写执行(r,w,x),还有若干的属性,包括是否为目录(d).文件(-).链接文件(l).拥有者.所属群组.容量大小(字节数).最后修改时间等等,可以通过chown.chgrp.chmod来变更这些属性和权限. 默认安全机制 首先,我们使用管理员root账户分别创建文件file001和目录dir001: 从上图可以看到, 文件file001的默认权限为rw-r--r--,即拥有者可读写,同群组下账户

Android安全机制解析与应用实践------- 权限机制 笔记(1)

一.Android 应用程序权限机制(1)安装PachageManagerService:installPackageLI:parsePackage解析AndroidManifest.xml 文件,获得应用申请权限:grandPermissionsLP授予应用相应权限的GID;(2)启动PachageManagerService:startProcessLocked启动应用程序时,创建新进程并传入GID.UID:forkAndSpecializeCommon创建SystemServer进程并设置

微软云计算介绍与实践(实践之二十七)

创建服务目录组 我们小张创建一个服务目录组,将用于基于角色的特定服务访问请求.比如小张希望人力资源组用户只显示基于AD的可用资源.特别说明:在服务管理器中的用户角色权限是累积的.下面是他的操作步骤: 1.从系统中心服务管理控制台,依次单击库 2.然后选择服务目录 3.在右侧栏中,单击创建目录组 4.从创建组向导点击下一步 5.接着我们小张创建一个目录组名为Contoso的服务目录组,并增加所有服务内容 6.从附加的成员界面点击添加 7.选择创建私有云和基础设施服务,然后单击确定 8.确认创建私有