您自己的用户模型的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:
- 我的情况下继承,而不是AbstractUser AbstractBaseUser;
- 这不是为管理员,但只为我的后端代码逻辑;
- 这里我没有使用Django REST API,但是如果REST API是正确的,请举个例子。
即使使用标准的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-permissions和https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#specifying-authentication-backends
感谢您的回答。我也在寻找一些能够做到这一点的软件包。 – coder
在这种情况下,[@ schneck's answer](http://stackoverflow.com/a/33229986/405174)应该可以工作。我没有使用过django-guardian,但是你给出的链接似乎表明你可以用你自己定制的User模型来使用它,它只是警告它需要一个多对多的关系, User''模型和''auth.Group''模型。 Django的''PermissionsMixin'',你已经在使用,定义了这种关系。你是否看到一个试图在模型中使用django-guardian的特定错误? – oogles
django-guardian涉及创建对象并难以使用。但它很强大,你有一个简单的例子吗?他们的示例项目没有公开很多功能。所以,我想出了一些其他的软件包来使用。 – coder
在您发布的documentation page,还指出:
基本上,如果我们继承AbstractUser或定义许多一对多关系 与auth.Group(并给反向相关名称组)我们应该是 罚款。
因为这是你在做什么,你应该设置AUTH_USER_MODEL
如写在Django documentention(见the ticket和commit code Django的1.5兼容)。
谢谢,但我的情况是AbstractBaseUser而不是AbstractUser。他们是不同的。 – coder
我结束了使用基于每个对象的权限逻辑,这样它不会改变我的数据库。这是支持我的基于类的视图的django-rules。请记住重写redirect_field_name,否则,如果用户登录,最终会出现重定向循环。
您是否正在使用Django Rest Framework?或者仅仅是Django? – user2719875
您是否希望将此集成到Django管理员中,还是仅用于您自己的代码中? – oogles
在更新中回答。 – coder