jasper的技术小窝

关注DevOps、运维监控、Python、Golang、开源、大数据、web开发、互联网

django中的权限管理

作者:jasper | 分类:django | 标签:   | 阅读 3840 次 | 发布:2014-09-13 4:49 p.m.

在谈论django的权限管理之前,有必要先介绍一下django里面的三种角色:
available:指明用户是否被认为活跃的,一旦登录,就会被置于available;
staff:指明用户是否可以登录到后台管理站点:
superuser:超级用户状态,指明该用户缺省拥有所有权限。

下面主要探讨的就是对available用户的权限设定。 django的权限认证被绑定在 django.contrib.auth 中,当在把django.contrib.auth加入到INSTALLED_APPS中,运行syncdb,就会在数据库中,建立如下几个表:

  • | auth_group |
  • | auth_group_permissions |
  • | auth_permission |
  • | auth_user |
  • | auth_user_groups |
  • | auth_user_user_permissions |

其实django的权限相关都记录在这几张表中,默认在auth_permission中,会为models中的所有表,分别创建add,delete和change三种权限,要为用户或是组赋予权限,可以直接操作auth_group_permissions或是auth_user_user_permissions表,当然更简单的方法是直接用django提供的后台,如下: 然而,更多的时候,我们并不是只想操作数据库的权限,而是针对某个view或是某个动作的权限,这是就需要我们自定义了。自定义的方法主要有两种:

一、直接在修改auth_permission表,在其中加入相应的字段:

name:必填。小于50个字符。例如:'Can do someting',会显示在上图之中。 content_type:必填。一个指向django_content_type数据库表,对于每一个Django模型,在这个表里面都有一个记录对应。 codename:必填。小于100个字符。例如:'can_do_someting'。

二、用代码来实现:

from django.contrib.auth.models import  Permission
from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get(app_label='myApp', model='Mymodel')
permission = Permission.objects.create(codename='can_do_someting',
                                       name='Can do someting',
                                       content_type=content_type)

这样就能在上面的图中看到'Can do someting'这个权限选项了。

那么在view中又是怎么来使用这些权限的呢? 首先实现最简单的控制,非登录用户禁止访问某一个view。在Django里面,只需要在相应的视图函数前面增加@login_required修饰符即可。针对已登录用户,主要有两种方式来判断是否有某种权限:

一、通过修饰符

限定view函数只有在user具有相应权限的情况下才能被访问,这里有两种修饰符如:

from django.contrib.auth.decorators import permission_required

@permission_required('myApp.can_do_someting', login_url="/login/")  
def my_view(request):
    .........

#上面第一个参数是权限,格式:app_label.codename,第二个参数是可选的 login_url 参数,这个参数让你指定登录页面的 URL (缺省为 settings.LOGIN_URL )。

from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.has_perm('myApp.can_do_someting'))
def my_view(request):
   ..........

二、是在view函数中去判断:

def my_view(request):
    if not request.user.has_perm('myApp.can_do_someting'):
         .......
   else:
        .......

本人是比较倾向于第二种方式,因为这样可以根据是否有权限,给前端返回不同的自定义内容,而且用第二种方式也可以很方便地运用在template中,给予不同权限的用户显示出不同的前端界面。 注:这里指谈了谈user的权限,对于group的权限,可以如法炮制。


转载请注明出处:http://www.opscoder.info/django_auth.html

其他分类: