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

cod*_*der 7 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)
Run Code Online (Sandbox Code Playgroud)

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

从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合适,请举个例子.

oog*_*les 14

即使使用标准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
Run Code Online (Sandbox Code Playgroud)

告诉Django使用您的自定义后端使用该AUTHENTICATION_BACKENDS设置.在settings.py中:

AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 'path.to.ObjectPermissionsBackend')
Run Code Online (Sandbox Code Playgroud)

然后,在您的代码中:

if user.has_perm('edit', article_instance):
    # allow editing
Run Code Online (Sandbox Code Playgroud)

请参阅https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#custom-users-and-permissionshttps://docs.djangoproject.com/en/1.8/topics/auth/customizing/ #指定认证,后端