通过在django模型中定义方法来管理对象权限

django-reinhardt的Python项目详细描述


Django Reinhardt

https://img.shields.io/pypi/v/django-reinhardt.svghttps://img.shields.io/travis/momamene/django-reinhardt.svgDocumentation StatusUpdates

有许多对象权限后端,如django-guardiandjango-permission

但有时,需要将权限定义为不仅仅是对象-用户关系。

django-reinhardt通过在django模型中定义方法来处理对象权限

安装

使用pip方式:

$ pip install django-reinhardt

使用量

在您的设置中添加额外的授权后端。py:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', # default
    'reinhardt.backends.PermissionBackend',
)

结束了。您不需要添加任何应用程序或迁移任何内容。

假设Inquiry模型需要有两个权限:change_inquryview_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

学分

这个包是用Cookiecutteraudreyr/cookiecutter-pypackage项目模板创建的。

历史记录

0.2.0(2016-08-2)

  • 改变如何区分权限相关方法与其他方法的方式。
  • 现在应该使用object_permissiondecorator而不是can_prefix来定义权限方法。

0.1.0(2016-07-19)

  • pypi上的第一个版本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何将cassandra中的行数据转换为与列相关的嵌套json   java如何使用jcr XPath在jcr:content/@jcr:data中搜索?   java在使用openCV进行安卓开发时如何利用手机的广角镜头   java解析扩展了接口,结束了一个潜在的无限循环   位置服务的@Override方法中存在java Android应用程序错误   java本地线程的用途和需求是什么   具有左右子访问的java节点树遍历   java验证JsonWebToken签名   JUL日志处理程序中的java日志记录   嵌入式Java读取给定时间段的串行数据。   java有没有办法从多个URL获取多个图像?   java线程通过等待intent阻止自己发送intent   java Spring MVC解析多部分内容请求   java JPA/Hibernate静态元模型属性未填充NullPointerException   java格式错误的字符(需要引号,得到I)~正在处理   java为什么PrintWriter对象抛出FileNotFoundException?   java Neo4j未正确保存标签   java IE不加载图像