2011-03-09 82 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

相關問題