Django权限使用总结
admin
2023-08-02 22:25:20
0

概述

Django自带有用户验证系统,它可以处理User、Group、permission以及基于用户cookie的session。这个文档是基于Django官网文档的介绍,以及其他的资料整理而来。主要的内容介绍了Django的用户验证系统的基本工作原理,并且也会对于如何为你的项目定制用户验证做出简单介绍。

Permission在Django中的工作原理

首先,我们需要定义permission对象,而这个对象在定义的时候是需要与对应的model绑定的。
然后,定义好的permission就可以赋予给user或者group对象,实现permission与用户的绑定。
最后,在view以及template中可以通过API对于user或者group进行权限的校验了。

权限的定义

permission可以使用多种方式进行定义:

在model中定义

我们可以在model的Meta中对permission进行定义。
官网示例如下:

单独定义

或者可以在独立于model之外的位置定义。
官网示例如下:

不绑定特定的model定义

以上的两个例子都是需要我们已经具有model的情况下才能定义permission,如果我们还没有model的情况下,又想要定义permission的话,应该怎么处理呢?虽然这个需求有点奇怪
引用至GoogleGroup一个不存在的页面:

url_content_type = ContentType.objects.create(
    name=\'url permission\', app_label=\'crashstats\', model=\'unused\')

can_view_url = Permission.objects.create(
    name=\'can view url\', content_type=url_content_type,
    codename=\'can_view_url\')

user = User.objects.get(username=\'example_user\', is_superuser=False)
user.user_permissions.add(can_view_url)

这样通过绑定到一个不存在的model来实现也是支持的。实际使用中发现在定义ContentType的时候,给model赋值空字符串也是可行的,但是None则不行。

一个更为通用的解决方案

这样就会得到我们所定义的permission对象了。而且Django会为每个permission赋予一个全局唯一的code,规则:.。通过这个code就可以指定相应的permission

权限的授予

权限的授予可以通过user或者group来进行。
user通过user_permissions属性设置permission,group通过permissions属性设置permission。

官网示例如下:

权限的校验

在view中校验权限

利用decorator校验

官网示例如下:

注意:permissions除了用string指定单个权限之外,还支持list以及tuple用于多个权限。

利用Mixin校验

官网示例如下:

在template中校验权限

如果在Django的settings里面设置了django.contrib.auth.context_processors.auth,以及启用了RequestContext的话,那Django就会默认在template中传递两个变量:

  • {{ user }}

  • {{ perms }}

其中的{{ perms }}变量就可以实现在template使用permission,从而达到通过不同的permission提供不同的template的功能。

实际上Django在template当中对于permission的使用提供了两个API的功能,一个是User.has_module_perms;另一个是User.has_perm。
当你在template中使用{{ perms.foo }}的时候就会调用User.has_module_perms方法,如果用户具有foo这个permission的话,这个值就会为True。
当你在template中使用{{ perms.foo.can_vote }}的时候就会调用User.has_perm方法,如果用户具有foo.can_vote这个permission的话,这个值就会为True。

permission在template中的使用示例:


参考文档

官网认证系统文档
官网ContentType文档
官网自定义校验文档

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...