django中的权限控制(form增删改)
2016-05-10 11:25
621 查看
Django默认提供了权限控制,但只能对使用了其自带的登录认证的用户进行权限控制,说白了就是只能对存储在auth_user表中的用户进行权限控制,但不能对未登录过的用户进行权限控制。但如果通过集成LDAP认证后的用户,其用户也会被缓存到该表中,即变相实现了AD用户也能进行权限控制。
权限是auth 应用中定义的Permission类型;User与Permission是many-to-many的关系。
Django对于每个模型类,自动增加add、change、delete三种权限,以便于权限控制。当然你也可以设定自己的权限。比如有一个名为hv的model,则该model就有了add、change和delete三种权限,可以在admin后台查看,如下图所示:
Django可以在view层面进行权限控制,即是否允许某个用户访问某个view,使用@permission_required修饰符实现。也可以通过request.user.has_perm() 来对add、change、delete三个动作分别进行权限控制。
一、对某个view进行权限控制,使用@permission_required()修饰符:
如果当前用户没有aptest.change_hv权限,则无法访问add页面,登录后依然还会继续跳回登录页面。
查看某个用户当前权限列表:
返回如下,permission name list:
二、对add、change、delete三个动作分别进行权限控制(比如用户登录一个页面后,可以查看页面内容,但不能进行增、删、改动作):
实例:用户登录后,判断是否具有add权限,如果没有则不能新增条目,实现如下:
编辑view视图,内容如下:
修改hv model中的一条记录
删除form中一条记录,直接item.delete()即可。
User和Group对象Permission管理:
user.user_permissions = [permission_list]
user.user_permissions.add(permission, permission, ...) #增加权限
user.user_permissions.remove(permission, permission, ...) #删除权限
user.user_permissions.clear() #清空权限
group permission管理逻辑与user permission管理一致,group中使用permissions字段做权限管理:
group.permissions = [permission_list]
group.permissions.add(permission, permission, ...)
group.permissions.remove(permission, permission, ...)
group.permissions.clear()
检查User或group权限用has_perm()方法:
user.has_perm('appname.add_modelname')
has_perm()方法的参数,即permission的codename,但传递参数时需要加上model 所属app的前缀,格式为<app label>.<permission codename>。
user.get_all_permissions()方法列出用户的所有权限,返回值是permission name的list
user.get_group_permissions()方法列出用户所属group的权限,返回值是permission name的list
检查用户所属组:
dir(request.user.groups)
request.user.groups.values() #返回用户所属组
[x['name'] for x in request.user.groups.values()] #返回用户所属组
示例:给当前用户添加hv model的change权限
可以在django_content_type和auth_permission表中查看ContentType、permission中的content_type、codename名称
#################################################################################
Django-guardian基于django的原生逻辑扩展了django的权限机制,应用django-guardian后,可使用django-guardian提供的方法以及django的原生方法检查全局权限,django-guardian提供的object permission机制使django的权限机制更完善。具体参考:http://www.jianshu.com/p/01126437e8a4
还可以通过如下方法限制用户是否可以访问view(http://www.jb51.net/article/69893.htm):
例如,下面视图确认用户登录并是否有 polls.can_vote权限:
?
并且Django有一个称为 user_passes_test 的简洁方式。它接受参数然后为你指定的情况生成装饰器。
?
user_passes_test 使用一个必需的参数: 一个可调用的方法,当存在 User 对象并当此用户允许查看该页面时返回 True 。 注意 user_passes_test 不会自动检查 User是否认证,你应该自己做这件事。
权限是auth 应用中定义的Permission类型;User与Permission是many-to-many的关系。
Django对于每个模型类,自动增加add、change、delete三种权限,以便于权限控制。当然你也可以设定自己的权限。比如有一个名为hv的model,则该model就有了add、change和delete三种权限,可以在admin后台查看,如下图所示:
Django可以在view层面进行权限控制,即是否允许某个用户访问某个view,使用@permission_required修饰符实现。也可以通过request.user.has_perm() 来对add、change、delete三个动作分别进行权限控制。
一、对某个view进行权限控制,使用@permission_required()修饰符:
如果当前用户没有aptest.change_hv权限,则无法访问add页面,登录后依然还会继续跳回登录页面。
from django.contrib.auth.decorators import login_required,permission_required #导入权限控制模块 @permission_required('aptest.change_hv',login_url="/aptest/loginauth") #第一个参数表示所需要的权限(权限名称通过user.get_all_permissions()方法查看),第二个参数定义需要登录到的url,默认为account/login。 def add(request): ...... ......
查看某个用户当前权限列表:
from django.contrib.auth.models import User user = User.objects.get(username=request.user.username) print user.get_all_permissions() #查看当前用户所具有的权限列表,返回值是permission name的list #print user.get_group_permissions()方法列出用户所属group的权限
返回如下,permission name list:
二、对add、change、delete三个动作分别进行权限控制(比如用户登录一个页面后,可以查看页面内容,但不能进行增、删、改动作):
实例:用户登录后,判断是否具有add权限,如果没有则不能新增条目,实现如下:
编辑view视图,内容如下:
@login_required(login_url="/aptest/loginauth") #不需要再使用permission_required()装饰器 def add(request): hvs = hv.objects.all() user = User.objects.get(username=request.user.username) print 'add page: ',user.get_all_permissions()if request.method == 'POST': form = hvform(request.POST) if form.is_valid(): #判断输入数据是否合法 #print form.cleaned_data['name'],form.cleaned_data['ip'] fc = form.cleaned_data if request.user.has_perm('aptest.add_hv'): #检查用户是否具有add权限,如果没有则不能保存新增内容 form.save() else: err.append(str(request.user.username) + 'doesnot has add permission.') else: err.append(form.errors) #输出错误信息 else: form = hvform() ls = range(10) context={'hour_offset':hour_offset,'ls':ls,'err':err,'hvs':hvs} return render(request,'aptest/form.html',context)
修改hv model中的一条记录
from django.shortcuts import get_object_or_404 try: item = get_object_or_404(hv,name=name) form=hvform(request.POST,instance=item) if form.is_valid(): #判断输入数据是否合法。如果先用form=hvform(request.POST)去检查数据是否合法,此处由于name是主键,则会报错,提示该name已存在。 if request.user.has_perm('aptest.change_hv'): #检查用户是否具有change权限,如果没有则不能进行修改 form.save() else: err.append(str(request.user.username) + 'doesnot has change permission.') else: err.append(form.errors.values()[0][0]) #输出错误信息,最好是自定义错误信息,此处输出中文乱码 except Exception: err...
删除form中一条记录,直接item.delete()即可。
User和Group对象Permission管理:
user.user_permissions = [permission_list]
user.user_permissions.add(permission, permission, ...) #增加权限
user.user_permissions.remove(permission, permission, ...) #删除权限
user.user_permissions.clear() #清空权限
group permission管理逻辑与user permission管理一致,group中使用permissions字段做权限管理:
group.permissions = [permission_list]
group.permissions.add(permission, permission, ...)
group.permissions.remove(permission, permission, ...)
group.permissions.clear()
检查User或group权限用has_perm()方法:
user.has_perm('appname.add_modelname')
has_perm()方法的参数,即permission的codename,但传递参数时需要加上model 所属app的前缀,格式为<app label>.<permission codename>。
user.get_all_permissions()方法列出用户的所有权限,返回值是permission name的list
user.get_group_permissions()方法列出用户所属group的权限,返回值是permission name的list
检查用户所属组:
dir(request.user.groups)
request.user.groups.values() #返回用户所属组
[x['name'] for x in request.user.groups.values()] #返回用户所属组
示例:给当前用户添加hv model的change权限
可以在django_content_type和auth_permission表中查看ContentType、permission中的content_type、codename名称
from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType #给当前用户添加hv model的change权限 user = User.objects.get(username=request.user.username) content_type = ContentType.objects.get_for_model(hv) permission = Permission.objects.get(content_type=content_type, codename='change_hv') request.user.user_permissions.add(permission) #request.user.user_permissions.remove(permission) #删除当前用户缓存的权限 if hasattr(user, '_perm_cache'): delattr(user, '_perm_cache') print ,request.user,user.get_all_permissions()
#################################################################################
Django-guardian基于django的原生逻辑扩展了django的权限机制,应用django-guardian后,可使用django-guardian提供的方法以及django的原生方法检查全局权限,django-guardian提供的object permission机制使django的权限机制更完善。具体参考:http://www.jianshu.com/p/01126437e8a4
还可以通过如下方法限制用户是否可以访问view(http://www.jb51.net/article/69893.htm):
例如,下面视图确认用户登录并是否有 polls.can_vote权限:
?
?
相关文章推荐
- poj 2262 Goldbach's Conjecture -- 筛法求素数打表
- Django(一)多对一模型
- Django:URL-patterns的高级使用方式与URL传递参数
- Create a Virtual Reality Game For Google Cardboard
- golang学习第二篇 开发环境的搭建
- Golang测试技术
- 龙书(Dragon book) +鲸书(Whale book)+虎书(Tiger book)
- 【转】十条有用的 Go 技术
- Go语言学习(十三)面向对象编程-继承
- Google地图的坑SupportMapFragment.getmap() returns null
- django获取指定列的数据
- 我是实践派之mongo的一主多从
- Go语言学习(十二)面向对象编程-结构体
- Bigtable 具体是怎样一个东西?和 MapReduce, Google File System 之间的关系是什么?
- Ubuntu 中给google配置HOSTS的方法
- Golang 模块扩展
- Go语言学习资料汇总
- Go语言学习(十一)面向对象编程-类型系统
- Django笔记(番外):虚拟环境
- LightOj 1259-Goldbach`s Conjecture(素数打表)