为特定用户/组添加对象权限,所有认证用户或匿名用户
项目描述
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
使用方法
将‘object_permission’添加到INSTALLED_APPS
将‘object_permission.backends.ObjectPermBackend’添加到AUTHENTICATION_BACKENDS
将‘ophandler.py’添加到您的应用目录中,例如‘admin.py’
编写特定模型的ObjectPermHandler,并将其与模型注册到object_permission.site
有关更多详细信息,请参阅object_permission_test。如果您想查看旧式策略,请参阅README_old.rst或object_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
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源分布
django-object-permission-0.5.2.tar.gz 的散列
| 算法 | 散列摘要 | |
|---|---|---|
| SHA256 | 0a1b15dc87c6a8455008a5b8a8b8a67bdc785139326d70257894f9ff30668048 |
|
| MD5 | 256745b5a513d455043287dc8ab0f16a |
|
| BLAKE2b-256 | 84f28f81dd2fa11423e18c0df0d05c0a6530ca825d54a98f53c62fafc177dcb5 |