2012-01-06 31 views
0

我有一個寬鬆的使用django.contrib.auth.decorators.login_required()django.views.decorators.http.require_http_methods() Django應用程序。前者是檢查當前用戶是否登錄在一個裝飾,和將它們導向它(與代碼302,這個)到如果在沒有登錄的登錄頁面。後者是其中檢查該請求方法的裝飾,並返回405(方法如果方法不在傳入列表中,則不執行)。因此,作爲一個例子,一個視圖功能可能看起來像:進行自定義HTTP身份驗證和方法時,正確的操作順序是什麼?

@require_http_methods(["GET", "POST", "DELETE"]) 
@login_required 
def my_view(request): 
    ... 

這裏的問題:很多的這些看法做內部權限檢查,如果用戶缺少對資源足夠的權限,它會返回403(禁止)。根據我的研究,這是不好的,因爲403需要發生之前檢查方法是否正確。但是,如果沒有login_required(),我必須在我的視圖中打開代碼用戶檢查。

有其他人的經驗?有沒有正確的答案?我知道這是作弊,但檢查方法,然後做登錄重定向,然後檢查用戶權限,還是需要重構這些視圖是不可接受的?

回答

0

我真的不知道關於您訂單的「正確性」,但對於任何一種複雜的查看權限計劃我會強烈建議編寫自己的自定義中間件來照顧視圖認證/權限。我不會用@login_required來裝飾每個視圖,而是在我自己的中間件中照顧它。

您也可以編寫自己的視圖裝飾器(可能會也可能不會帶參數),並獲得您想要的不同視圖的行爲。

+0

每個視圖所需的權限完全是特定於視圖的。中間件不是合適的地方,裝飾者也不是。我需要登錄的用戶,我需要確信用戶確實存在,我必須在* login_required之後*,或者登錄重定向自己。 – Corbin 2012-01-07 00:17:32

+0

我只是在中間件中實現登錄重定向 - 然後你可以做任何事後想要的認證(在中間件或視圖中)。 – dgel 2012-01-07 00:26:32

+0

由於中間件始終運行,但大多數視圖不需要登錄,所以不會出現問題嗎? – Corbin 2012-01-07 00:29:52

相關問題