django中的权限控制(form增删改)
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页面,登录后依然还会继续跳回登录页面。
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()
#################################################################################
还可以通过如下方法限制用户是否可以访问view(http://www.jb51.net/article/69893.htm):
例如,下面视图确认用户登录并是否有 polls.can_vote权限:
1
2
3
4
5
|
def vote(request): if request.user.is_authenticated() and request.user.has_perm( 'polls.can_vote' )): # vote here else : return HttpResponse( "You can't vote in this poll." ) |
并且Django有一个称为 user_passes_test 的简洁方式。它接受参数然后为你指定的情况生成装饰器。
1
2
3
4
5
6
7
|
def user_can_vote(user): return user.is_authenticated() and user.has_perm( "polls.can_vote" ) @user_passes_test (user_can_vote, login_url = "/login/" ) def vote(request): # Code here can assume a logged-in user with the correct permission. ... |
user_passes_test 使用一个必需的参数: 一个可调用的方法,当存在 User 对象并当此用户允许查看该页面时返回 True 。 注意 user_passes_test 不会自动检查 User是否认证,你应该自己做这件事。
django中的权限控制(form增删改)的更多相关文章
- Django中对单表的增删改查
之前的简单预习,重点在后面 方式一: # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象 book_obj=Book.objects.creat ...
- Django中ORM对数据库的增删改查操作
前言 什么是ORM? ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...
- Django中ORM对数据库的增删改查
Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...
- Django中用户权限模块
Django中用户权限模块 1 auth模块 auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管理系 ...
- <实训|第九天>掌握linux中普通的权限控制和三种特殊的权限(sst),做合格的运维工程师
linux中,权限的学习是必不可少的,不论是作为一名运维工程师或者是单一的管理者,学习好linux中的权限控制,你就可以保护好自己的隐私同时规划好你所管理的一切. 权限的学习是很多的,不要认为自己已经 ...
- C++ 中的权限控制
权限控制,指的是用户只能访问符合自己权限的资源,系统对用户进行权限控制以防止用户的误操作/恶意操作等. 在C++代码中,权限控制指的是程序员在接口声明/类声明/函数声明等中进行的授权控制.如下面的代码 ...
- JS中对数组元素进行增删改移
在js中对数组元素进行增删改移,简单总结了一下方法: 方法 说明 实例 push( ); 在原来数组中的元素最后面添加元素 arr.push("再见58"); unshift( ) ...
- kibana的Dev Tool中如何对es进行增删改查
kinaba Dev Tool中对es(elasticSearch)进行增删改查 一.查询操作 查询语句基本语法 以下语句类似于mysql的: select * from xxx.yyy.topic ...
- Django学习笔记--数据库中的单表操作----增删改查
1.Django数据库中的增删改查 1.添加表和字段 # 创建的表的名字为app的名称拼接类名 class User(models.Model): # id字段 自增 是主键 id = models. ...
随机推荐
- 解决MySQL联表时出现字符集不一样
mysql 建表时都会设置表的字符集和排序规则,通常是 utf8,不过我这边习惯建表的字符集是 utf8mb4,排序规则是 utf8mb4_unicode_ci.有些 utf8mb4 的表默认排序规则 ...
- java的if语句,少于一行可以省略大括号
我们认识的 if 语句,大概是这样的: if(条件){ 语句1; }else{ 语句2; } 如果要执行的语句少于1行,大括号是可以省略的 可以让程序更简洁和美观 if(条件){ 语句1; 语句2; ...
- C++11中右值引用和移动语义
目录 左值.右值.左值引用.右值引用 右值引用和统一引用 使用右值引用,避免深拷贝,优化程序性能 std::move()移动语义 std::forward()完美转发 容器中的emplace_back ...
- Spring Boot 不使用默认的 parent,改用自己的项目的 parent
在初学spring boot时,官方示例中,都是让我们继承一个spring的 spring-boot-starter-parent 这个parent: <parent> <group ...
- Java接口调用工具类
package com.qiyuan.util; import java.io.BufferedReader; import java.io.IOException; import java.io.I ...
- java.util.Collection源码分析和深度讲解
写在开头 java.util.Collection 作为Java开发最常用的接口之一,我们经常使用,今天我带大家一起研究一下Collection接口,希望对大家以后的编程以及系统设计能有所帮助,本文所 ...
- SQL Server附加数据库拒绝访问解决方法汇总
@本文来自百度 方法一:修改权限法 1 打开要附加的数据库文件所在的文件夹,即扩展名为mdf的文件所在的文件夹,如下图所示: 2 右键单击mdf文件,选择“属性”,如下图所示: 3 单击“安全”选项卡 ...
- springcloud-Feign基础使用
声明式REST客户端:Feign Feign是一个声明式的Web服务客户端.它使得Web服务客户端的写入更加方便.具有可插拔注解支持,包括Feign注解和JAX-RS注解. Spring Cloud增 ...
- 【原】Spring整合Shiro基础搭建[3]
1.前言 上个Shiro Demo基础搭建是基于官方的快速入门版本,没有集成其他框架,只是简单的通过Main方法来执行Shiro工作流程,并测试一下比较核心的函数:但在企业开发中一般都会集成Sprin ...
- java基础题目日常思考(持续更新)
public static void main(String[] args) { Integer a = 0; count(a); System.out.println(a); // 问题: a 输出 ...