django(权限、认证)系统—— Permissions和Group
接着上面的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:
user.hash_perm(
'school.add_studygroup'
)
user.hash_perm(
'school.change_studygroup'
)
user.hash_perm(
'school.delete_studygroup'
)
当然,我们也可以自己定义一些许可。方法很简单,就是在Model类的meta属性中添加permissions定义。比方说,创建了一个模型类叫做Discussion,我们可以创建几个权限来对这个模型的权限许可进行控制,控制某些人可以发起讨论、发起回复,关闭讨论。
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, ...)
比如我们要判断一个用户是否有发讨论的权限,我们可以用下面的代码:
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的方法。
编程创建权限:
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。
比方说我们可以这样判断一个用户是否是登陆用户,进而作出不同的显示:
{% 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属性类型相同。我们可以通过:
group.permissions
=
[permission_list]
group.permissions.add(permission, permission, ...)
group.permissions.remove(permission, permission, ...)
group.permissions.clear()
给该组赋予权限。
在下一篇博文中,我们将讨论Django内置的权限控制系统中的核心部件,backend,作为讨论Django内置权限控制的最后的一篇。
django(权限、认证)系统—— Permissions和Group的更多相关文章
- django用户认证系统——拓展 User 模型
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- Django之认证系统
Django之认证系统 cookie和session 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞 ...
- Django的认证系统—auth模块
Django的认证系统 auth模块的知识点总结: 1. 创建超级用户 python manage.py createsuperuser from django.contrib import auth ...
- django用户认证系统——拓展 User 模型2
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- django用户认证系统——基本设置1
网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...
- “Django用户认证系统”学习资料收集
首推追梦人物——Django用户认证系统 待续……
- django用户认证系统——重置密码7
当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...
- django用户认证系统——修改密码6
再此之前我们已经完成了用户登录.注册.注销等功能,接下来让我们继续为用户提供修改密码的功能.该功能 Django 的 auth 应用也已经为我们提供,过程几乎和之前的登录功能完全一样. 编写修改密码模 ...
- Django用户认证系统(三)组与权限
Django的权限系统很简单,它可以赋予users或groups中的users以权限. Django admin后台就使用了该权限系统,不过也可以用到你自己的代码中. User对象具有两个ManyTo ...
随机推荐
- Linux 系统应用编程——线程基础
传统多任务操作系统中一个可以独立调度的任务(或称之为顺序执行流)是一个进程.每个程序加载到内存后只可以唯一地对应创建一个顺序执行流,即传统意义的进程.每个进程的全部系统资源是私有的,如虚拟地址空间,文 ...
- SVN中更改连接用户
Eclipse中安装了SVN插件,当连接到SVN服务器后,便无法从客户端更改连接帐号 百度一下,也就知道 查看Eclipse中使用的是什么SVN Interface,位置在 windows > ...
- webpack.config.js配置文件
1.基本配置 webpack在执行时,除在命令行传入参数,还可以通过指定的配置文件来执行.默认会搜索当前目录下webpack.config.js.这个文件是一个node.js模块,返回一个json格式 ...
- Dapper.SimpleCRUD mysql 插入数据时出现的小插曲
最近想玩一下.net dapper,然后在nuget包中搜索看到了 Dapper.SimpleCRUD ,然后我等好奇心重的小骚年,内心又开始跃跃欲试. 使用sqlserver数据库时没有遇到问题,既 ...
- Eclipse 3.5 以后安装插件很慢的解决办法
1 .除非你需要,否则不要选择"联接到所有更新站点" 在安装对话框里有一个小复选框,其标示为"在安装过程中联接到所有更新站点从而找到所需的软件."从表面上看,这 ...
- TCP TIME WAIT
根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime) ...
- access窗体最大化到软件大小
Private Sub Form_Load()DoCmd.ShowToolbar "Ribbon", acToolbarNo '窗体最大化,占满软件最 End Sub
- 基于one2team框架的Highcharts图表图片导出方案
这篇文章已经没有什么意义了,新版的HIghcharts提供Java图片导出解决方案,你需要做的就是下个Maven,bulid一个war就Ok了.---addedy on 2012-11-15 多说一句 ...
- 走进netty
三月份开始看公司RPC框架的源码,发现如果要折腾明白,网络通讯这块知识必不可少.于是从如下几点开始逐步研究. 一.基础知识篇 1.Unix下5种I/O模型 Linux的内核将所有外部设备都看作一个文件 ...
- 服务器禁止ping
禁止ping后,不让别人通过域名ping到你的ip, 如果禁用后,你在ping自己的域名会给你返回服务商的IP并提示超时, 这样你就可以减少IP暴露,增加一点安全. 禁止方法: 编辑 /etc/sys ...