django中的权限控制

  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)

 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()

检查用户权限用has_perm()方法:
user.has_perm(‘app.hv‘)
has_perm()方法的参数,即permission的codename,但传递参数时需要加上model 所属app的前缀,格式为<app label>.<permission codename>。

无论permission赋予user还是group,has_perm()方法均适用

user.get_all_permissions()方法列出用户的所有权限,返回值是permission name的list
user.get_group_permissions()方法列出用户所属group的权限,返回值是permission name的list

示例:给当前用户添加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是否认证,你应该自己做这件事。

时间: 2024-12-16 10:53:02

django中的权限控制的相关文章

&lt;实训|第九天&gt;掌握linux中普通的权限控制和三种特殊的权限(sst),做合格的运维工程师

linux中,权限的学习是必不可少的,不论是作为一名运维工程师或者是单一的管理者,学习好linux中的权限控制,你就可以保护好自己的隐私同时规划好你所管理的一切. 权限的学习是很多的,不要认为自己已经把自己的隐私保护的很好,漏洞总是有的,侧面的攻击往往是难以防守的.所以大家跟我一起学习一下基础的权限控制,在后面也会有更多关于权限控制的知识点分享出来.谢谢各位的关注和支持!  开班第九天: 今天的课程大纲: linux系统中文件目录的基本权限控制 如何来修改默认的生成权限 三种特殊的权限(s,s,

django中的url控制

1.django中的第一个控件:url控制  (路由分发) urls.py:请求路径与视图函数的之间的关系 步骤: 1.首先是要配置环境,   2.其次就是引路径   3.在视图的文件夹里面写相应的函数 简单使用: 1.通过正则加括号分组获取请求参数  (正则只是针对字符串格式的匹配)   2.一般在写地址的时候用正则中的有名分组,这样以后在调用的时候变量调用的时候直接用的是关键字传参,就可以随便的去书写参数的位置   3.分发:include(如果出现特别多的url写在一个urls中是非常麻烦

如何在 vue 中添加权限控制管理?---vue中文社区

前言 在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作.作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制. 需求 因为这是一个工作上的业务需求,所以对于我来说主要有两个地方需要进行权限控制. 第一个是侧边菜单栏,需要控制显示与隐藏. 第二个就是页面内的各个按钮,弹窗等. 流程 如何获取用户权限? 后端(当前用户拥有的权限列表)-> 前端(通过后端的接口获取到,下文中我们把当前用户的权限列表叫做 permission

171.补充-在模板中添加权限控制

在模板中使用权限: 在settings.TEMPLATES.OPTIONS.context_process下,因为添加了django.auth.context_processors.auth上下文处理器,因此,在模板中可以直接通过perms来获取用户的所有权限,示例代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title

&lt;实训|第十三天&gt;linux中ACL权限控制以及磁盘配额,附编译属于自己的linux内核

[[email protected]~]#序言 首先讲讲昨天关于缩容失败,开不机的解决方法:ACL权限也算是一个很重要的知识点,不难,但是很实用:磁盘配额一般不需要自己弄,但是要懂得原理.剩下的就是编译属于自己的linux内核,根据自己的需求不论是硬件还是其他,你都可以定制,但是编译成功与否这个我不敢保证,我也编译了两次才成功的.  开班第十三天: [[email protected]~]#今天的课程大纲 1.缩容失败原因以及开不了机解决方法 2.Linux中ACL权限的详解 3.讲解一下磁盘配

AngularJS中实现权限控制 - 基于RBAC

权限的设计中比较常见的就是RBAC基于角色的访问控制,基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合.每一种角色对应一组相应的权限. 一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限.这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,而且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销. 在Angular构建的单页面应用中,要实现这样的架构我们需要额外多做一些事

CRM Transaction处理中的权限控制

当试图打开一个Opportunity时, 系统会进行如下一系列的权限检查: 1. 检查Authorization object CRM_ORD_OP: 此处会检查当前user的partner function和partner function category的设置情况: 如果检查失败,会抛出error message: 2. 进行第二轮针对CRM_ORD_LP的检查: 3. 如果再失败,进行第三轮对CRM_OPP的权限检查: 45代表Allow: 4. 如果再失败,进行第四轮对CRM_ORD_

SAP CRM Transaction处理中的权限控制

当试图打开一个Opportunity时, 系统会进行如下一系列的权限检查: 1. 检查Authorization object CRM_ORD_OP: 此处会检查当前user的partner function和partner function category的设置情况: 如果检查失败,会抛出error message: 2. 进行第二轮针对CRM_ORD_LP的检查: 3. 如果再失败,进行第三轮对CRM_OPP的权限检查: 45代表Allow: 4. 如果再失败,进行第四轮对CRM_ORD_

基于MVC4+EasyUI的Web开发框架形成之旅--权限控制

我在上一篇随笔<基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍>中大概介绍了基于MVC的Web开发框架的权限控制总体思路.其中的权限控制就是分为"用户登录身份验证"."控制器方法权限控制"."界面元素权限控制"三种控制方式,可以为Web开发框架本身提供了很好用户访问控制和权限控制,使得用户界面呈现菜单.Web界面的按钮和内容.Action的提交控制,均能在总体权限功能分配和控制之下. 本篇文章主要细化这三个方面