Django中的许可(Permissions)和用户组(Group)
Reference: http://www.cnblogs.com/esperyong/archive/2012/12/20/2826690.html
接着上面的3篇讨论文章,我们阐述了Django中如何使用Authentication系统进行,用户的创建,登陆,登出,完成了用户的认证。接下来,我们要看另外一个议题,那就是Authorization授权。在Django中这部分使用Permission来简单完成的。在这篇文章中,我们要对Permission进行一下研究。
Django中的Permissions设置,主要通过Django自带的Admin界面进行维护。主要通过设置某些用户对应于某类模型的add\change\delete三种类型的权限,即是设置某些人对某些模型能够增加、修改、删除的权限设置。
Permission不仅仅能够设置某类模型,还可以针对一个模型的某一个对象进行设置。
许可(Permissions)
其实,当我们在django中安装好了auth应用之后,Django就会被每一个你安装的app中的Model创建三个权限:add,change,delete;相应的数据,就是在你执行python manage.py syncdb之后插入到数据库中的。每一次你执行syncdb,Django都会为每个用户给新出现的Model增加这三个权限。
例如,你创建了一个应用叫做school,里面有一个模型叫做StudyGroup,那么你可以用任何一个user对象执行下面的程序,其结果都返回True:
1
2
3
|
user.hash_perm( 'school.add_studygroup' ) user.hash_perm( 'school.change_studygroup' ) user.hash_perm( 'school.delete_studygroup' ) |
当然,我们也可以自己定义一些许可。方法很简单,就是在Model类的meta属性中添加permissions定义。比方说,创建了一个模型类叫做Discussion,我们可以创建几个权限来对这个模型的权限许可进行控制,控制某些人可以发起讨论、发起回复,关闭讨论。
1
2
3
4
5
6
7
8
|
class Discussion(models.Model): ... class Meta: permissions = ( ( "open_discussion" , "Can create a discussion" ), ( "reply_discussion" , "Can reply discussion" ), ( "close_discussion" , "Can remove a discussion by setting its status as closed" ), ) |
接下来要做的就是最后一步,执行manage.py syncdb,这样数据库中就有了这三个许可了。
我们可以将上面的权限赋予用户,方法有两种:
- 通过某一个user的user_permissions属性(文章1中有提及):
user.user_permissions.add(permission, permission, ...)
- 通过user的一个组,然后通过Group的permissions属性:
group.permissions.add(permission, permission, ...)
比如我们要判断一个用户是否有发讨论的权限,我们可以用下面的代码:
1
|
user.has_perm( 'school.open_discussion' ) |
Permission类和User类没什么特殊的,都是普通的DjangoModel。在第一篇文章中我们详细探讨了User模型的属性和方法。在这里我们探讨一下Permission模型和如何用编程的方式而不是通过预定义然后syncdb的方式创建permission。因为也许在某些时候,需要动态创建并分配权限。
Permission 属性:
所属模块:django.contrib.auth.models
属性:
- name:必填。小于50个字符。例如:'Can publish'。
- content_type:必填。一个指向django_content_type数据库表,对于每一个Django模型,在这个表里面都有一个记录对应。
- codename:必填。小于100个字符。例如:'can_publish'。
方法:没有特殊方法。具有所有普通DjangoModel的方法。
编程创建权限:
1
2
3
4
5
6
7
|
from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType content_type = ContentType.objects.get(app_label = 'school' , model = 'Discussion' ) permission = Permission.objects.create(codename = 'can_publish' , name = 'Can Publish Discussions' , content_type = content_type) |
在界面中使用许可
接下来,我们需要探讨一下如何在Template(模板)中使用许可。因为有的时候需要在界面上,通过一些许可来控制界面的显示。
在Django中在界面上进行权限设置非常方便,因为Django为你做了很多工作。
在模版代码中,有两个属性,是Django给你提供好的,一个是user,一个是perms。
比方说我们可以这样判断一个用户是否是登陆用户,进而作出不同的显示:
1
2
3
4
5
|
{% if user.is_authenticated %} < p >Welcome, {{ user.username }}. Thanks for logging in.</ p > {% else %} < p >Welcome, new user. Please log in.</ p > {% endif %} |
user变量是一个User或者AnoymousUser对象。
perms变量是一个django.contrib.auth.context_processors.PermWrapper对象,对当前用户的User.has_module_perms和User.has_perm进行了封装。这个包装器让你使用perm起来非常的方便。比如,我们需要判断当前用户是否拥有school应用下的所有权限,则使用
{{perms.school}}
我们如果判断当前用户是否拥有school应用下发表讨论的权限,则使用{{perms.school.publish_discussion}}
这样结合template的if标签,我们可以通过判断当前用户所具有的权限,显示不同的界面了:
{% if perms.school %} < p >You have permission to do something in the school app.</ p > {% if perms.school.publish_discussion %} < p >You can discussion!</ p > {% endif %} {% if perms.school.reply_discussion %} < p >You can reply discussion!</ p > {% endif %} {% else %} < p >You don't have permission to do anything in the school app.</ p > {% endif %} |
当然,我们不禁要问,在模版中为何会有这两个变量呢?Django是如何做到的呢?答案是:settings 中的TEMPLATE_CONTEXT_PROCESSORS中定义的django.contrib.auth.context_processors.auth处理器。在Django进入解析Template之前,首先要经过这一个个的context_processor。其中django.contrib.auth.context_processors.auth就是将user和perms这俩对象放到TemplateContext中去的。
另外,我们还需要使用RequestContext作为TemplateContext。例如:
from django.template import RequestContext from django.shortcuts import render_to_response def someview(request): ...view logic ctx = {somekey:somevalue} return render_to_response( 'instances/accounts/tparts/update_share_limit_form.html' , ctx, context_instance = RequestContext(request)) |
确保上述两个要点,我们在template中使用权限控制就非常的简单了。
接下来我们简单说一下最后一个核心模型:用户组。
用户组(Group)
用户组模型很简单,和User模型是多对多的关系。用户组顾名思义,就是对用户进行了分组。其作用在权限控制中就是可以批量的对用户的许可进行分配,而不用一个一个的按用户分配,节省维护的工作量。
将一个用户加入到一个Group中,该用户就拥有了该Group所分配的所有许可。例如,如果一个组teachers有许可can_create_lesson。那么所有属于teachers组的用户都会有这个权限。
Group:
属性:
- name:必须。少于80个字符。
- permissions:多对多引用。和user的user_permissions属性类型相同。我们可以通过:
1234
group.permissions
=
[permission_list]
group.permissions.add(permission, permission, ...)
group.permissions.remove(permission, permission, ...)
group.permissions.clear()
给该组赋予权限。
Django中的许可(Permissions)和用户组(Group)的更多相关文章
- Django中的Model(表结构)
Model(表设计) 在这里只提经常用到的三种联表结构: 一对多:models.ForeignKey(其他表) 多对多:models.ManyToManyField(其他表) 一对一:models.O ...
- django中聚合aggregate和annotate GROUP BY的使用方法
接触django已经很长时间了,但是使用QuerySet查询集的方式一直比较低端,只会使用filter/Q函数/exclude等方式来查询,数据量比较小的时候还可以,但是如果数据量很大,而且查询比较复 ...
- Django中的Model(操作表)
Model 操作表 一.基本操作 # 增 models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs obj = m ...
- Django中ORM介绍和字段及其参数
ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- Django中用户权限模块
Django中用户权限模块 1 auth模块 auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管理系 ...
- linux 中更改用户权限和用户组的命令chmod,chgrp实例
linux 中更改用户权限和用户组的命令实例; 增加权限给当前用户 chmod +wx filename chmod -R 777 /upload 用户组 chgrp -R foldname zdz ...
- Django中的权限系统
Django中已经为我们设置好了基本的权限系统,在定义好model同步数据库后,在每个库下面都会有一张 'auth_permission' 表.该表里面记录了每条权限的描述(name字段,can do ...
- Django中ORM介绍
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- Django中ORM介绍和字段及字段参数
Object Relational Mapping(ORM) 1 ORM介绍 1.1 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对 ...
随机推荐
- 【转载】最全的面试题目整理(HTML+CSS部分)
转载自 知乎 @西点王子 https://www.zhihu.com/people/F211/answers 1. 常用那几种浏览器测试?有哪些内核(Layout Engine)? (Q1) 浏览器: ...
- .bat批处理命令的介绍
HUC = = D组 http://www.cnhonkerarmy.com/ 63707869 =====================================开始============ ...
- zepto学习之路--核心函数$()的实现
$()可以说是jquery的精华了,为dom操作带来了极大的灵活和方便.zepto号称“移动版的jquery”,那么它是怎么来实现这个核心函数呢?我们来详细探讨下. 1.首先,我们看下zepto中它是 ...
- storm第一篇--概念,例子,参数优化
1 概念 目前最新的0.8.0版本里面 worker -> 进程.一个worker只能执行同一个spout/bolt的task,一个worker里面可以有多个executor. executor ...
- MQ日常维护操作手册
假设队列管理器为QMgrName,以下所有使用QMgrName的地方您都可以替换成您维护的mq队列管理器名称. 一.MQ的启动与停止 用root用户启/停需要root用户包含在mqm组中. 1.MQ的 ...
- Web安全检测工具的使用.
Nikto2 Nikto2是一款使用perl语言写的多平台扫描软件,是一款命令行模式的工具,它可以扫描指定主机的WEB类型 主机名.特定目录.Cookie.特定CGI漏洞.XSS漏洞.sql注入漏洞. ...
- 读取cc2530节点的设备类型、协调器、路由器、终端。
建立网络.加入网络流程分析 协调器节点:在1-10 实验8 网络通信实验2 组播通信中 while(MSGpkt) { switch(MSGpkt->hdr.event) { case ZDO ...
- Bootstrap 手风琴搭配导航条实现常用菜单栏
效果 HTML代码 <div class="sidebar"> <div class="mc-search"> <div clas ...
- [iOS]C语言技术视频-13-指针变量练习三(结构体指针变量)
下载地址: 链接: http://pan.baidu.com/s/1bnx2xm3 密码: t4mj
- C++ Builder多线程编程技术经验谈(转)
源:C++ Builder多线程编程技术经验谈 线程之可行性 在很多情况下,可能需要为程序创建线程.这里给出其中一些可能性: (1)如果创建的是一个多文档接口(Multiple Document ...