您自己的用户模型的Django Per Object权限

问题描述:

我已经实现了我自己的User模型类,如下所示。请注意,它是不是定制django的auth.User模型。我对这个对象的权限知识很陌生,特别是在我的项目中需要的这个自定义用户模型中。您自己的用户模型的Django Per Object权限

你可以举一个例子,在这种情况下添加每个对象的权限?非常感激。

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin 

class CustomUser(AbstractBaseUser, PermissionsMixin): 
     email = models.EmailField(max_length=40, unique=True) 
     //.... other fields are omitted 

class Article(models.Model): 
    title = models.CharField('title', max_length=120) 
    body = models.TextField('body') 
    author = models.ForeignKey(CustomUser) 

现在,对象权限开始发挥作用。每个用户都可以创建/更新/删除/查看他们自己的文章对象,但只有在没有更新/删除权限的情况下才能查看他人的文章。

从django文档中,模型级别权限不适用于此处。如果文章具有模型级别更新权限,则所有用户都可以更新他人的文章。

因此,我发现了django-guardian。然而,这个自定义的CustomUser模型似乎没有希望,因为它很大程度上依赖于Django的auth.User模型!

https://django-guardian.readthedocs.org/en/v1.2/userguide/custom-user-model.html

UPDATE:

  1. 我的情况下继承,而不是AbstractUser AbstractBaseUser;
  2. 这不是为管理员,但只为我的后端代码逻辑;
  3. 这里我没有使用Django REST API,但是如果REST API是正确的,请举个例子。
+0

您是否正在使用Django Rest Framework?或者仅仅是Django? – user2719875

+0

您是否希望将此集成到Django管理员中,还是仅用于您自己的代码中? – oogles

+0

在更新中回答。 – coder

即使使用标准的auth.User模型,对象级权限也不会内置到Django中。但是基础在于Django的PermissionsMixin定义了has_perm方法,它接受模型实例。 Django默认不做任何事,但你可以。

has_perm方法有效地将艰苦的工作传递到注册的认证后端。因此,您可以创建一个专门用于执行对象级权限检查的自定义身份验证后端。它不需要实际处理认证。它可以像一个基本类的单一方法一样简单。像下面的(未经测试)的东西是你应该需要:

class ObjectPermissionsBackend(object): 

    def has_perm(self, user_obj, perm, obj=None): 
     if not obj: 
      return False # not dealing with non-object permissions 

     if perm == 'view': 
      return True # anyone can view 
     elif obj.author_id == user_obj.pk: 
      return True 
     else: 
      return False 

告诉Django使用AUTHENTICATION_BACKENDS设置为使用自定义的后端。在设置中。潘岳:

AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 'path.to.ObjectPermissionsBackend') 

然后,在你的代码:

if user.has_perm('edit', article_instance): 
    # allow editing 

https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#custom-users-and-permissionshttps://docs.djangoproject.com/en/1.8/topics/auth/customizing/#specifying-authentication-backends

+0

感谢您的回答。我也在寻找一些能够做到这一点的软件包。 – coder

+0

在这种情况下,[@ schneck's answer](http://*.com/a/33229986/405174)应该可以工作。我没有使用过django-guardian,但是你给出的链接似乎表明你可以用你自己定制的User模型来使用它,它只是警告它需要一个多对多的关系, User''模型和''auth.Group''模型。 Django的''PermissionsMixin'',你已经在使用,定义了这种关系。你是否看到一个试图在模型中使用django-guardian的特定错误? – oogles

+0

django-guardian涉及创建对象并难以使用。但它很强大,你有一个简单的例子吗?他们的示例项目没有公开很多功能。所以,我想出了一些其他的软件包来使用。 – coder

在您发布的documentation page,还指出:

基本上,如果我们继承AbstractUser或定义许多一对多关系 与auth.Group(并给反向相关名称组)我们应该是 罚款。

因为这是你在做什么,你应该设置AUTH_USER_MODEL如写在Django documentention(见the ticketcommit code Django的1.5兼容)。

+0

谢谢,但我的情况是AbstractBaseUser而不是AbstractUser。他们是不同的。 – coder

我结束了使用基于每个对象的权限逻辑,这样它不会改变我的数据库。这是支持我的基于类的视图的django-rules。请记住重写redirect_field_name,否则,如果用户登录,最终会出现重定向循环。