使用django.contrib.auth限制对Ajax服务的访问

时间:2011-03-09 10:01:07

标签: python django django-authentication

在已经使用django.contrib.auth进行身份验证的Web应用程序中,我正在寻找“标准”方法来限制仅向经过身份验证的用户访问Ajax服务。

使用@login_required装饰器不会,因为这只会将未经身份验证的用户重定向到登录页面。对于服务,我们应该发送一个有效的,格式正确的错误响应 - 而不是一些登录表单。

这是我想到的第一种方法:

from django.http import HttpResponse

def some_json_service_view(request):
    if not request.user.is_authenticated():
        return HttpResponse('{success: false}')
    return HttpResponse('{success: true}')

更进一步,如果我可以针对所有“未经过身份验证”的错误标准化单个响应,那么装饰器就会很好:

from django.http import HttpResponse

def login_required_json(f):
    def new_f(request):
        if not request.user.is_authenticated():
            return HttpResponse('{success: false}')
        return f(request)
    return new_f

@login_required_json
def some_json_service_view(request):
    return HttpResponse('{success: true}')

这是其他人如何做到的,还是有更多人接受它的方式?理想情况下,有人可以指出我为此目的制作的django.contrib包。

1 个答案:

答案 0 :(得分:3)

如果AJAX服务仅由前端客户端使用,那么这是一个很好的例子。我一直这样做,因为相同的设计被用于通过客户端需要执行其他操作或以其他方式向用户提供一些反馈的响应将所有其他类型的数据推送到客户端。当您的网站具有混合用户时,它非常有用,即您同时支持匿名用户和注册用户。

如果您的构建服务为第三方供应商提供服务,则您必须使用OAuth,基本HTTP访问身份验证或摘要HTTP访问身份验证。当您知道/假设执行请求的用户都已注册凭据时,您可以执行此操作。因此,这些身份验证方案允许用户在身份验证系统对凭证提出质疑时对其进行身份验证,而这些凭据可以立即提供,而无需手动将其输入到重定向的登录页面。

因此,如果您的服务有混合用户,我会坚持使用您拥有的服务。否则,您将不得不采取更精细的方法,假设未经身份验证的用户拥有并可立即提供其凭据。

在任何一种情况下,我建议你看一下django-piston。它就像一个非常简单的控制器,用于解析AJAX请求和序列化AJAX响应。基于提供的模型和HTTP动词,它可以在向用户代理公开模型访问时自动为您做很多繁重工作,此外还包含OAuth和HTTP访问身份验证。