跳转到主要内容

为特定用户/组添加对象权限,所有认证用户或匿名用户

项目描述

django-object-permissiono 将对象权限功能应用于Django模型

安装

sudo pip install django-object-permission

sudo pip install git+git://github.com/lambdalisue/django-object-permission.git#egg=django-object-permission

使用方法

  1. 将‘object_permission’添加到INSTALLED_APPS

  2. 将‘object_permission.backends.ObjectPermBackend’添加到AUTHENTICATION_BACKENDS

  3. 将‘ophandler.py’添加到您的应用目录中,例如‘admin.py’

  4. 编写特定模型的ObjectPermHandler,并将其与模型注册到object_permission.site

有关更多详细信息,请参阅object_permission_test。如果您想查看旧式策略,请参阅README_old.rstobject_permission_test_deprecated

示例迷你博客应用

models.py:

from django.db import models
from django.contrib.auth.models import User

# django-author: useful for adding automatically update author field
from author.decorators import with_author

@with_author
class Entry(models.Model):
        PUB_STATES = (
                ('public', 'public entry'),
                ('protected', 'login required'),
                ('private', 'secret entry'),
        )
        pub_state = models.CharField('publish status', choices=PUB_STATES)
        title = models.CharField('title', max_length=140)
        body = models.TextField('body')

        # ...

ophandler.py:

from object_permission import site
# AuthorObjectPermHandler need 'django-observer' and required 'author'
# field (the author field is automatically added by 'with_author' decorator)
from object_permission.handlers import ObjectPermHandler

from models import Entry

class EntryObjectPermHandler(ObjectPermHandler):
    """ObjectPermHandler for model which has author field

    This handler contribute..

        1.  Manager permission to instance author
        2.  Viewer permission to authenticated user
        3.  Viewer permission to anonymous user if reject_anonymous is False

    """
    author_field = 'author'
    reject_anonymous = False

    def get_author(self):
        """get author field value"""
        return getattr(self.instance, self.author_field)

    def setup(self):
        # watch author field
        self.watch(self.author_field)

    def updated(self, attr):
        # Author has full access
        self.manager(self.get_author())
        # Authenticated user can view
        self.viewer(None)
        if self.reject_anonymous:
            self.reject('anonymous')
        else:
            self.viewer('anonymous')
# Register to object_permission site like django.contrib.admin
site.register(Entry, EntryObjectPermHandler)

views.py:

from django.views.generic import ListView
from django.views.generic import DetailView
from django.views.generic import CreateView
from django.views.generic import UpdateView
from django.views.generic import DeleteView
from django.core.urlresolvers import reverse

from object_permission.decorators import permission_required

from models import Entry
from forms import EntryForm

class EntryListView(ListView):
    model = Entry

class EntryDetailView(DetailView):
    model = Entry
    slug_field = 'title'

    # decorate 'dispatch' method without method_decorator
    @permission_required('blog.view_entry')
    def dispatch(self, *args, **kwargs):
        return super(EntryDetailView, self).dispatch(*args, **kwargs)

# You can use the decorator as View class decorator
# Then automatically decorate 'dispatch' method of the View
@permission_required('blog.add_entry')
class EntryCreateView(CreateView):
    form_class = EntryForm
    model = Entry

@permission_required('blog.change_entry')
class EntryUpdateView(UpdateView):
    form_class = EntryForm
    model = Entry

@permission_required('blog.delete_entry')
class EntryDeleteView(DeleteView):
    model = Entry
    def get_success_url(self):
        return reverse('blog-entry-list')

index.html:

{% load object_permission_tags %}
<html>
<head>
        <title>django-object-permission example</title>
</head>
<body>
        {% pif 'blog.add_entry' of None or 'blog.change_entry' of object or 'blog.delete_entry' of object %}
        <!-- displayed only user who has `blog.add_entry` permission,
                `blog.change_entry` permision for object or
                `blog.delete_entry` permission for object -->
                <h2>Toolbox</h2>
                {% pif 'blog.add_entry' of object %}
                        <!-- displayed only user who has `blog.add_entry` permission -->
                        <a href="{% url 'blog-entry-create' %}">Add New Entry</a>
                {% endpif %}
                {% pif object and 'blog.change_entry' of object %}
                        <!-- displayed only user who has `blog.change_entry` permission for object -->
                        <a href="{% url 'blog-entry-update' object.pk %}">Change this entry</a>
                {% endpif %}
                {% pif object and 'blog.delete_entry' of object %}
                        <!-- displayed only user who has `blog.delete_entry` permission for object -->
                        <a href="{% url 'blog-entry-delete' object.pk %}">Delete this entry</a>
                {% endpif%}
        {% endpif %}
</body>
</html>

设置

OBJECT_PERMISSION_EXTRA_DEFAULT_PERMISSIONS

所有模型额外默认权限的列表。Django默认为所有模型贡献‘add’、‘change’和‘delete’权限。

默认: ['view']

OBJECT_PERMISSION_BUILTIN_TEMPLATETAGS

如果这是True,那么 pif 将是内置的模板标签,这意味着您在使用 pif 标签之前不需要添加 {% load object_permission_tags %}

默认值: True

OBJECT_PERMISSION_AUTODISCOVER

启用自动发现功能。对象权限将自动搜索每个应用的 ‘ophandler’(或 OBJECT_PERMISSION_HANDLER_MODULE_NAME)模块并进行加载。

默认值: True

OBJECT_PERMISSION_HANDLER_MODULE_NAME

用于为每个应用搜索对象权限处理程序模块。

默认值: 'ophandler'

OBJECT_PERMISSION_DEPRECATED

如果这是True,则加载所有已弃用功能。除非您的项目太大而无法重构,否则不应启用此功能,因为已弃用功能不再受支持且有限。

将在版本0.5中删除

OBJECT_PERMISSION_MODIFY_FUNCTION(已弃用)

设置对象保存时用于修改对象权限的函数名称。默认值为 modify_object_permission

OBJECT_PERMISSION_MODIFY_M2M_FUNCTION(已弃用)

设置对象多对多关系更新时用于修改对象权限的函数名称。默认值为 modify_object_permission_m2m

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面