prepend_urls 方法的 Django Tastypie 身份验证

Django Tastypie Authentication for prepend_urls methods

我的应用程序有几种用户类型 admin、user 和 manager。

我已经为资源定义了一个端点,它有几个 prepend_urls。 例如:端点将是

/Profile/search/
/Profile/shortview/
/Profile/

如何限制对端点的访问,以便

/Profile/search/ is accessible to admin, manager
/Profile/shortview/ is accessible to all
/Profile/ is accessible to admin only

我考虑过使用我自己的 class 但用于身份验证和授权,但认为它们应用于整个资源而不是单个 prepend_url 端点。

authorization = MyAuthorization()
authentication= MyAuthentication()

感谢任何帮助

我假设您已经配置了 prepend_urls,因此您包装了一个名为 dispatch_search 的函数,所以如果用户未被授权使用端点:

def dispatch_search(self, request, *args, **kwargs):
    # check authorization here
    self._meta.authorization.is_authorized(request)

从下方编辑

从 DjangoAuthorization class 继承时,您还可以重写方法:

  • read_detail(自身,object_list,捆绑)
  • read_list(自身,object_list,捆绑)

如果用户不能读取特定资源或资源列表本身,则引发异常。

以及您的 MyAuthorization class:

from tastypie.exceptions import Unauthorized
from tastypie.authorization import DjangoAuthorization

class MyAuthorization(DjangoAuthorization):
    def is_authorized(self, request):
        if request.user.is_superuser and 'search' in request.path:
            return True
        # more business logic here to check the other endpoints
        raise Unauthorized('Unauthorized :(')

    def read_list(self, object_list, bundle):
        self.is_authorized(bundle.request)  # call your custom validation
        # Fallback to the DjangoAuthorization read_list
        return super(MyAuthorization, self).read_list(object_list, bundle)

请参阅文档以获取您可以重写以添加更多业务逻辑的完整函数列表:http://django-tastypie.readthedocs.org/en/latest/authorization.html#the-authorization-api