• Django中的许可(Permissions)和用户组(Group)


    Reference: http://www.cnblogs.com/esperyong/archive/2012/12/20/2826690.html

    接着上面的3篇讨论文章,我们阐述了Django中如何使用Authentication系统进行,用户的创建,登陆,登出,完成了用户的认证。接下来,我们要看另外一个议题,那就是Authorization授权。在Django中这部分使用Permission来简单完成的。在这篇文章中,我们要对Permission进行一下研究。

    Django中的Permissions设置,主要通过Django自带的Admin界面进行维护。主要通过设置某些用户对应于某类模型的addchangedelete三种类型的权限,即是设置某些人对某些模型能够增加、修改、删除的权限设置。

    Permission不仅仅能够设置某类模型,还可以针对一个模型的某一个对象进行设置。 

    许可(Permissions)

    其实,当我们在django中安装好了auth应用之后,Django就会被每一个你安装的app中的Model创建三个权限:add,change,delete;相应的数据,就是在你执行python manage.py syncdb之后插入到数据库中的。每一次你执行syncdb,Django都会为每个用户给新出现的Model增加这三个权限。

    例如,你创建了一个应用叫做school,里面有一个模型叫做StudyGroup,那么你可以用任何一个user对象执行下面的程序,其结果都返回True:

    1
    2
    3
    user.hash_perm('school.add_studygroup')
    user.hash_perm('school.change_studygroup')
    user.hash_perm('school.delete_studygroup')

    当然,我们也可以自己定义一些许可。方法很简单,就是在Model类的meta属性中添加permissions定义。比方说,创建了一个模型类叫做Discussion,我们可以创建几个权限来对这个模型的权限许可进行控制,控制某些人可以发起讨论、发起回复,关闭讨论。

    1
    2
    3
    4
    5
    6
    7
    8
    class Discussion(models.Model):
        ...
        class Meta:
            permissions = (
                ("open_discussion""Can create a discussion"),
                ("reply_discussion""Can reply discussion"),
                ("close_discussion""Can remove a discussion by setting its status as closed"),
            )

    接下来要做的就是最后一步,执行manage.py syncdb,这样数据库中就有了这三个许可了。

    我们可以将上面的权限赋予用户,方法有两种:

    1. 通过某一个user的user_permissions属性(文章1中有提及):
      user.user_permissions.add(permission, permission, ...)

        

    2. 通过user的一个组,然后通过Group的permissions属性:
      group.permissions.add(permission, permission, ...)

        

    比如我们要判断一个用户是否有发讨论的权限,我们可以用下面的代码:

    1
    user.has_perm('school.open_discussion')  

     Permission类和User类没什么特殊的,都是普通的DjangoModel。在第一篇文章中我们详细探讨了User模型的属性和方法。在这里我们探讨一下Permission模型和如何用编程的方式而不是通过预定义然后syncdb的方式创建permission。因为也许在某些时候,需要动态创建并分配权限。

    Permission 属性:

    所属模块:django.contrib.auth.models

    属性:

    1. name:必填。小于50个字符。例如:'Can publish'。
    2. content_type:必填。一个指向django_content_type数据库表,对于每一个Django模型,在这个表里面都有一个记录对应。
    3. codename:必填。小于100个字符。例如:'can_publish'。

    方法:没有特殊方法。具有所有普通DjangoModel的方法。

    编程创建权限:

    1
    2
    3
    4
    5
    6
    7
    from django.contrib.auth.models import Group, Permission
    from django.contrib.contenttypes.models import ContentType
     
    content_type = ContentType.objects.get(app_label='school', model='Discussion')
    permission = Permission.objects.create(codename='can_publish',
                                           name='Can Publish Discussions',
                                           content_type=content_type)

    在界面中使用许可

    接下来,我们需要探讨一下如何在Template(模板)中使用许可。因为有的时候需要在界面上,通过一些许可来控制界面的显示。

    在Django中在界面上进行权限设置非常方便,因为Django为你做了很多工作。

    在模版代码中,有两个属性,是Django给你提供好的,一个是user,一个是perms。

    比方说我们可以这样判断一个用户是否是登陆用户,进而作出不同的显示:

    1
    2
    3
    4
    5
    {% if user.is_authenticated %}
        <p>Welcome, {{ user.username }}. Thanks for logging in.</p>
    {% else %}
        <p>Welcome, new user. Please log in.</p>
    {% endif %}

    user变量是一个User或者AnoymousUser对象。

    perms变量是一个django.contrib.auth.context_processors.PermWrapper对象,对当前用户的User.has_module_perms和User.has_perm进行了封装。这个包装器让你使用perm起来非常的方便。比如,我们需要判断当前用户是否拥有school应用下的所有权限,则使用

    {{perms.school}}

    我们如果判断当前用户是否拥有school应用下发表讨论的权限,则使用{{perms.school.publish_discussion}}

    这样结合template的if标签,我们可以通过判断当前用户所具有的权限,显示不同的界面了:

    {% if perms.school %}
        <p>You have permission to do something in the school app.</p>
        {% if perms.school.publish_discussion %}
            <p>You can discussion!</p>
        {% endif %}
        {% if perms.school.reply_discussion %}
            <p>You can reply discussion!</p>
        {% endif %}
    {% else %}
        <p>You don't have permission to do anything in the school app.</p>
    {% endif %}

    当然,我们不禁要问,在模版中为何会有这两个变量呢?Django是如何做到的呢?答案是:settings 中的TEMPLATE_CONTEXT_PROCESSORS中定义的django.contrib.auth.context_processors.auth处理器。在Django进入解析Template之前,首先要经过这一个个的context_processor。其中django.contrib.auth.context_processors.auth就是将user和perms这俩对象放到TemplateContext中去的。

    另外,我们还需要使用RequestContext作为TemplateContext。例如:

    from django.template import RequestContext
    from django.shortcuts import render_to_response
    def someview(request):
        ...view logic
        ctx = {somekey:somevalue}
        return render_to_response('instances/accounts/tparts/update_share_limit_form.html',
                                                  ctx,
                                                  context_instance=RequestContext(request))

      

    确保上述两个要点,我们在template中使用权限控制就非常的简单了。

    接下来我们简单说一下最后一个核心模型:用户组。

    用户组(Group)

    用户组模型很简单,和User模型是多对多的关系。用户组顾名思义,就是对用户进行了分组。其作用在权限控制中就是可以批量的对用户的许可进行分配,而不用一个一个的按用户分配,节省维护的工作量。

    将一个用户加入到一个Group中,该用户就拥有了该Group所分配的所有许可。例如,如果一个组teachers有许可can_create_lesson。那么所有属于teachers组的用户都会有这个权限。

    Group:

    属性:

      1. name:必须。少于80个字符。
      2. permissions:多对多引用。和user的user_permissions属性类型相同。我们可以通过:
        1
        2
        3
        4
        group.permissions = [permission_list]
        group.permissions.add(permission, permission, ...)
        group.permissions.remove(permission, permission, ...)
        group.permissions.clear()

        给该组赋予权限。

  • 相关阅读:
    java并发5-volatile关键字解析
    java并发4-单例设计方法
    Java并发3-多线程面试题
    JAVA并发2
    JAVA并发
    2015第27周三Java内存模型
    同一时候使用windows和linux系统
    深入浅出Windows BATCH
    DrawText的使用
    redmine忘记username和password
  • 原文地址:https://www.cnblogs.com/skying555/p/5992711.html
Copyright © 2020-2023  润新知