通过在django模型中定义方法来管理对象权限
django-reinhardt的Python项目详细描述
Django Reinhardt
有许多对象权限后端,如django-guardian或django-permission。
但有时,需要将权限定义为不仅仅是对象-用户关系。
django-reinhardt通过在django模型中定义方法来处理对象权限
- 自由软件:麻省理工学院许可证
- 文档:https://django-reinhardt.readthedocs.io。
使用量
在您的设置中添加额外的授权后端。py:
AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', # default 'reinhardt.backends.PermissionBackend', )
结束了。您不需要添加任何应用程序或迁移任何内容。
假设Inquiry模型需要有两个权限:change_inqury,view_inquiry
class Inquiry(models.Model): writer = models.ForeignKey(settings.AUTH_USER_MODEL) text = models.TextField() pub_date = models.DateTimeField(auto_now_add=True) @object_permission(codename='change_inquiry') def is_changeable_by(self, user): return self.writer == user or user.is_staff @object_permission(codename='view_inquiry') def is_viewable_by(self, user): return self.writer == user
然后,您可以定义具有user参数、由object_permission修饰的方法。
现在,以下代码将按预期工作:
user1 = get_user_model().objects.create( username='nanase' ) user2 = get_user_model().objects.create( username='maiyan' ) user3 = get_user_model().objects.create( username='ikuta' ) inquiry = Inquiry.objects.create( writer=self.user1, text='How can I delete my account?' ) assert user1.has_perm('yourapp.change_inquiry', obj=inquiry) == True assert user2.has_perm('yourapp.view_inquiry', obj=inquiry) == False assert user3.has_perm('yourapp.change_inquiry', obj=inquiry) == False assert user3.has_perm('yourapp.view_inquiry', obj=inquiry) == True
学分
这个包是用Cookiecutter和audreyr/cookiecutter-pypackage项目模板创建的。
历史记录
0.2.0(2016-08-2)
- 改变如何区分权限相关方法与其他方法的方式。
- 现在应该使用object_permissiondecorator而不是can_prefix来定义权限方法。
0.1.0(2016-07-19)
- pypi上的第一个版本。