码迷,mamicode.com
首页 > 其他好文 > 详细

django中的权限控制

时间:2016-05-10 12:50:34      阅读:549      评论:0      收藏:0      [点我收藏+]

标签:

  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是否认证,你应该自己做这件事。

django中的权限控制

标签:

原文地址:http://www.cnblogs.com/dreamer-fish/p/5477178.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!