6

我正在使用 Tastypie 0.9.11,并且我希望允许未经身份验证的用户对 API 具有只读权限,同时,如果用户使用 API 密钥身份验证进行身份验证,则该用户可以执行添加/更改/删除操作那些相同的模型。

使用 API Key Authentication + Django Authorization 不满足要求 1(未经身份验证的用户根本无法访问 API)。使用无身份验证不允许用户使用 API 密钥进行身份验证(不满足要求 2)。

我敢打赌有一种简单的方法可以实现这种行为,请帮忙。

非常感谢,尤瓦尔·科恩

4

1 回答 1

8

您需要考虑两件事。身份验证和授权。

首先,如果请求方法是 GET,则无论 API 密钥如何,您都需要对所有用户进行身份验证,因为所有其他方法都使用 ApiKeyAuthentication。

现在,所有经过身份验证的用户都需要经过授权。在这里,您还需要确保始终允许 GET 请求。这样的事情应该让你开始:

from tastypie.resources import ModelResource
from tastypie.authentication import ApiKeyAuthentication
from tastypie.authorization import DjangoAuthorization

class MyAuthentication(ApiKeyAuthentication):
    """
    Authenticates everyone if the request is GET otherwise performs
    ApiKeyAuthentication.
    """

    def is_authenticated(self, request, **kwargs):
        if request.method == 'GET':
            return True
        return super(MyAuthentication, self).is_authenticated(request, **kwargs)

class MyAuthorization(DjangoAuthorization)
    """
    Authorizes every authenticated user to perform GET, for all others
    performs DjangoAuthorization.
    """

    def is_authorized(self, request, object=None):
        if request.method == 'GET':
            return True
        else:
            return super(MyAuthorization, self).is_authorized(request, object)

class MyResource(ModelResource):

    class Meta:
        authentication = MyAuthentication()
        authorization = MyAuthorization()

所以基本上你的使用方法ApiKeyAuthentication只是DjangoAuthorization缺少对 GET 请求的特殊处理。

于 2012-09-05T01:33:24.860 回答