Django Tastypie 中的自定义授权 class

Custom Authorization class in Django Tastypie

我使用了以下自定义授权class

class CustomDjangoAuthorization(DjangoAuthorization):
    def read_detail(self, object_list, bundle):
        result = super(CustomDjangoAuthorization, self).read_detail(object_list, bundle)
        # now we check here for specific permission
        if bundle.request.user.profile.user_status:
            raise Unauthorized("You are not allowed to access that resource.")
        return result

它给出

401 Unauthorized

user_status = 1。但是当我将 user_status 更改为 0 时,它仍然显示

401 Unauthorized

错误。

我未发送授权的原因是,对于每个请求,tastypie 都会检查授权,并给出 200 响应为确定和 401 为未授权。我在这里遗漏了什么吗?

嘿 Sean,我尝试在 super 之前移动自定义代码。我得到一个

AttributeError: ‘AnonymousUser’ object has no attribute ‘profile’

本地主机一切正常,生产出现问题。 这在两种情况下都会发生,当 user_status = 1user_status = 0

使用 Django 1.8 和 Tastypie 0.13.3。

在调用 super() 之前移动您的自定义代码,并添加一个检查以查看用户是否是匿名的:

class CustomDjangoAuthorization(DjangoAuthorization):
   def read_detail(self, object_list, bundle):
    # check here for specific permission
    if (not bundle.request.user.is_authenticated()) or bundle.request.user.profile.user_status:
        raise Unauthorized("You are not allowed to access that resource.")
    result = super(CustomDjangoAuthorization, self).read_detail(object_list, bundle)
    return result

您收到 AttributeError: ‘AnonymousUser’ object has no attribute ‘profile’ 是因为您的用户已注销,所以 request.userAnonymousUser,因此没有 profile

根据您的代码和症状,我猜您的授权详细信息不正确。检查您的 usernameapi_key。可能是您输入错误或您在生产中使用了本地授权详细信息。

@Sean Hayes 是对的,我的用户已注销。我正在使用自定义 url 并且不知道默认情况下它没有采用我的 APIAuthentication。

我必须在我的自定义方法中添加 self.is_authenticated(request) 才能正常工作。