用于prepend_urls方法的Django Tastypie身份验证

时间:2016-02-18 03:35:23

标签: django tastypie

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

我已经为Resource定义了一个端点,它有几个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

我曾想过使用我自己的类但是用于身份验证和授权,但认为它们适用于整个资源而不是单独的prepend_url端点。

authorization = MyAuthorization()
authentication= MyAuthentication()

感谢任何帮助

1 个答案:

答案 0 :(得分:1)

我假设您已经配置了prepend_urls,因此您已经包含了一个名为dispatch_search的函数,因此如果用户未经授权使用该函数,则此类内容将引发异常端点:

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

从下方编辑

从DjangoAuthorization类继承时,您还可以覆盖方法:

  • read_detail(self,object_list,bundle)
  • read_list(self,object_list,bundle)

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

你的MyAuthorization类:

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