django tastypie基于授权用户的REST查询过滤

时间:2017-07-11 04:11:50

标签: python django rest tastypie

我希望对通过tastypie提供REST界面的django Web应用程序进行更改。该应用程序位于:
https://github.com/OWASP/django-DefectDojo/

在应用内,用户拥有他们有权查看的产品以及属于产品的端点

模型定义如下:
https://github.com/OWASP/django-DefectDojo/blob/master/dojo/models.py#L177 https://github.com/OWASP/django-DefectDojo/blob/master/dojo/models.py#L417

我已将EndpointResource添加到dojo/api.py

class EndpointResource(BaseModelResource):
    class Meta:
        queryset = Endpoint.objects.all()
        resource_name = 'endpoints'
        fields = ['product', 'protocol', 'host', 'path', 'query', 'fragment']

        list_allowed_methods = ['get']
        detail_allowed_methods = ['get']
        include_resource_uri = True
        filtering = {
            'product': ALL,
            'protocol': ALL,
            'host': ALL,
        }
        authorization = DjangoAuthorization()
        authentication = DojoApiKeyAuthentication()
        serializer = Serializer(formats=['json'])

类产品包含:
authorized_users = models.ManyToManyField(User, blank=True)
class Endpoint包含:
product = models.ForeignKey(Product, null=True, blank=True, )

目前,用户可以向/api/v1/endpoints/进行身份验证,他们会看到所有终端。

curl -v --header 'Authorization: ApiKey sue:5b632d76ef1a38b8375383e3498d063515b356d4' http://example.com/api/v1/endpoints/

但是,所期望的行为是用户应该只能访问他们被授权的产品以及这些产品的相关实体。

从python会话中我可以做到:

>>> from dojo.models import User, Product, Endpoint
>>> User.objects.get(username='sue').product_set.all().get().endpoint_set.all()
[<Endpoint: goliath.sue.local>, <Endpoint: goliath.suelimited.co>, <Endpoint: 192.168.10.11>]

这些与'sue'相关联的对象是我想要由API返回的对象 用tastypie来实现这一目标的最佳方法是什么? 任何帮助非常感谢,如果我需要发布更多信息,请告诉我。

2 个答案:

答案 0 :(得分:0)

最简单的方法是将int size=5; for(int i=0;i<size;i++) { vectorA.push_back(vectorB[i]); } 子类化。请参阅文档here中的更多内容。

DjangoAuthorization

答案 1 :(得分:0)

使用链接中的代码 https://github.com/OWASP/django-DefectDojo/blob/master/dojo/finding/views.py#L68 作为指南,在EndpointResource类中添加了以下方法:

def get_object_list(self, request):
    return super(EndpointResource, self).get_object_list(request).filter(product__authorized_users__in=[request.user])

它按照我的描述执行,但有兴趣获得反馈,看看它是否是正确的做法。