您自己的用户模型的Django每个对象权限

时间:2015-10-20 03:31:32

标签: django permissions

我已经实现了我自己的User模型类,如下所示。请注意,自定义django' auth.User模型。我是这个对象权限知识的新手,特别是在我的项目中需要的这个自定义用户模型中。

您能举例说明在这种情况下添加每个对象的权限吗?非常感谢。

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

更新

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

4 个答案:

答案 0 :(得分:13)

即使使用标准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设置来使用您的自定义后端。在settings.py中:

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

答案 1 :(得分:0)

在您发布的documentation page中,还有声明:

  

基本上,如果我们继承AbstractUser或定义多对多关系   使用auth.Group(并提供反向关联名称组)我们应该   细

由于这是您正在进行的操作,因此您应该按照Django documentention中的说明设置AUTH_USER_MODEL(另请参阅the ticketcommit code以获取Django 1.5兼容性)。

答案 2 :(得分:0)

我最终使用基于逻辑的每个对象权限,因此它不会改变我的数据库。它是django规则,支持我基于类的视图。请记住覆盖redirect_field_name,否则,如果用户已登录,您将最终使用重定向循环。

答案 3 :(得分:-1)

您需要清除一些有关权限如何工作的基础知识。它以一种新手可以理解的方式进行: 第一步是在模型中使用Meta并在“模型定义”本身中添加该模型的权限。现在,在django中进行迁移时,django会知道“嘿!现在有一个自定义权限,我现在必须考虑。”让我将此添加到自定义权限中” 现在进入第二步,您定义用户并给他与您在第一步模型中定义的完全相同的权限。 (到目前为止,如果您有道理,djago-gurdia doc对您而言将显得明亮而清晰)。因此,当用户登录并在使用模型时在您的代码中,您可以进行检查(确定,实际上是询问django,嘿,django!您还记得我已经为此模型定义了一个权限,并且授予了用户相同的权限。能否请您检查并告诉我登录的用户是否实际上具有该权限')