使用django.contrib.auth限制对Ajax服务的访问
在一个已经使用 django.contrib.auth
进行用户认证的网页应用中,我想找一种“标准”的方法来限制只有经过认证的用户才能访问 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 个回答
3
这个例子在你的前端客户端只使用AJAX服务时效果很好。我经常这样做,因为同样的设计可以用来通过响应将各种数据推送到客户端,客户端需要根据这些数据进行额外的操作或者给用户提供反馈。当你的网站有不同类型的用户时,比如既有匿名用户又有注册用户,这种方法效果特别好。
不过,如果你是为第三方供应商构建服务,那你就得使用OAuth、基本的HTTP访问认证或者摘要HTTP访问认证。这种情况是因为你知道或者假设发出请求的用户都有注册的凭证。因此,这些认证方式允许用户在认证系统要求他们提供凭证时,立刻提供,而不需要手动在重定向的登录页面输入。
所以,如果你的服务有不同类型的用户,我建议你继续使用你现在的方法。否则,你就需要采用更复杂的方案,假设未认证的用户能够立即提供他们的凭证。
无论哪种情况,我建议你看看django-piston。它就像一个相当简单的控制器,用于解析AJAX请求和序列化AJAX响应。根据提供的模型和HTTP请求类型,它可以自动为你处理很多繁重的工作,帮助用户访问模型,同时它也内置了OAuth和HTTP访问认证功能。