我們已經實現了登錄和注銷功能,但是它還沒有起作用。因為匿名用戶還是可以通過直接輸入url:http://localhost:8000/depotapp/product/list/ 訪問到產品管理界面。這就好像你在門上加了把鎖,卻沒有把窗戶關上一樣。所以我們還需要進行訪問控制。
我們這里實現最簡單的控制,非登錄用戶禁止訪問產品管理界面。在Django里面,只需要在相應的視圖函數前面增加@login_required修飾符即可:
login_required實現了如下功能:
如果用戶沒有登錄, 重定向到/accounts/login/,並且把當前絕對URL作為next參數用get方法傳遞過去;
如果用戶已經登錄, 正常地執行視圖函數。
這樣我們例子中需要的功能就實現了。但是這充其量是“登錄限制”,而更常見的需求是“訪問控制”,即區分已經登錄的用戶,對不同的視圖有不同的訪問權限。因為我們的例子中沒有涉及到,所以只把相關的做法簡單例舉在下面。
1.訪問控制功能通過Django的 request.user.has_perm() 來實現,該函數返回True或False,表示該用戶是否有權限。而權限是auth 應用中定義的Permission類型;User與Permission是many-to-many的關系。
2. Django還提供了一個@permission_required修飾符,來限定view函數只有在User具有相應權限的情況下才能被訪問。
3. Django對於每個模型類,自動增加add、change、delete三種權限,以便於權限控制。當然你也可以設定自己的權限。