2011-03-09 83 views
2

在已经使用django.contrib.auth进行身份验证的Web应用程序限制访问阿贾克斯服务,我在寻找的“标准”的方式限制到只有经过身份验证的用户访问的Ajax服务。使用django.contrib.auth

使用@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包。

回答

3

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

如果第三方供应商的建设服务,虽然,你要么必须使用OAuth,基本的HTTP访问身份验证或摘要HTTP访问认证。当您知道/假定执行请求的用户都具有注册凭证时,您可以这样做。因此,这些身份验证方案允许用户在身份验证系统向他们提供证书时向他们提出身份验证,他们可以立即为他们提供证书,而无需手动将其输入到重定向的登录页面。

因此,如果您的服务已混合的用户,我会跟你有什么坚持。否则,你将不得不采取更详细的东西,假设未经认证的用户可以立即提供他们的凭证。

在任何情况下,我建议你看一看django-piston。这就像一个非常简单的控制器,用于解析AJAX请求和序列化AJAX响应。基于提供的模型和HTTP动词,在向用户代理公开模型访问权限时,它可以自动完成许多繁重的工作,并且还包含OAuth和HTTP访问认证。

+1

感谢您的回复,菲利普。获得支持意见总是很好的: - 我打算让这个话题公开几天,看看我们是否有任何相反的观点。我只处理*我的*前端访问服务,但我喜欢公共与私人服务之间的区别。 'django-piston'看起来非常有用,特别是如果你正在编写RESTful接口。 – 2011-03-09 21:24:50

相关问题