tastypie - 验证在POST上创建对象的权限

时间:2012-03-31 20:19:17

标签: django tastypie

使用精彩的django-tastpie。

我的应用程序有一个文档概念(即word doc)。有一个文档的所有者和许多编辑。编辑可以添加评论。

我想在发布评论之前检查编辑是否对文档具有权限。但是我无法弄清楚如何使用tastpie执行此检查。

这是我的代码简化了一下:

# models.py

class Document(models.Model):
    doc_text = models.TextInput()
    owner = models.ForeignKey(User)
    editor_group = models.ForeignKey(EditorGroup)

class EditorGroup(models.Model):
    name = models.CharField()
    user = models.ManyToManyField(User)

class Comment(models.Model):
    comment = models.CharField()
    user = models.ForeignKey()
    document = models.ForeignKey()

-

# api.py

class CommentResource(ModelResource):
    user = fields.ForeignKey(UserResource, 'user')

    class Meta:
        queryset = Comment.objects.all()
        resource_name = 'comments'
        authorization= DjangoAuthorization()

        def obj_create(self, bundle, request, **kwargs):

            # What code can I put here to check if the Editor is in the 
            # EditorGroup

            return super(AnswerResource, self).obj_create(bundle, request, user=request.user)

如果编辑正在审阅文档并提交评论,我想在我允许他们创建评论之前验证他们是编辑组的一部分。

我已经研究过使用obj_create但是我不确定如何访问Document对象以查看Editor(现在是request.user)是否属于EditorGroup。

还不确定obj_create是否是执行此检查的正确位置。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

以下是其中一个选项:

if request.user.groups.filter(id=self.document.editor_group.id).exists():
    ...post_comment
else:
    ...don't post comment

答案 1 :(得分:1)

如果您需要检查Document对象上的内容,那么下面的解决方案似乎没问题。您可以使用build_related_resource类的RelatedField方法从URI获取资源并将其转换为有效的Django对象。但是,如果您需要检查组,权限和授权,最好在django-tastypie docs中查看Implementing Your Own Authentication/Authorization

class CommentResource(ModelResource):

    user = fields.ForeignKey(UserResource, 'user')
    document = fields.ForeignKey(DocumentResource, 'user')

    def obj_create(self, bundle, request=None, **kwargs):
        document_uri = json.loads(request.POST.keys()[0]['document'])
        document = self.document.build_related_resource(document_uri).obj
        if request.user.has_permission_to(document) or request.user.is_editor:
            [...]