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

问题描述 投票:0回答:4

我已经实现了自己的用户模型类,如下所示。请注意,这不是自定义 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

我的案例是继承 AbstractBaseUser 而不是 AbstractUser;
  1. 这不适合管理员,仅适用于我的后端代码逻辑;
  2. 我这里没有使用Django REST API,但如果REST API合适,请举个例子。
django permissions
4个回答
25
投票
auth.User

模型也是如此。但基础是 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

通过 
AUTHENTICATION_BACKENDS

设置告诉 Django 使用您的自定义后端。在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/stable/topics/auth/customizing/#custom-users-and-permissions

https://docs.djangoproject.com/en/stable/topics/身份验证/定制/#指定身份验证后端


1
投票


0
投票
文档页面

中,还指出:

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

由于这就是您正在做的事情,因此您应该按照
Django 文档

中的说明设置

AUTH_USER_MODEL
(另请参阅票证提交代码以了解 Django 1.5 兼容性)。


-3
投票

© www.soinside.com 2019 - 2024. All rights reserved.