2013-04-17 113 views
0

在我的Django項目中,我有各種由Django內置認證系統創建的用戶。每個用戶都可以創建自己的App模型實例。我想限制用戶訪問對象,以便用戶只能查看他們創建的實例。要做到這一點我創建了這個觀點:控制Django auth用戶對特定對象實例的訪問

@login_required 
def appDetail(request, app_id): 
    try: 
     app = App.objects.get(pk=app_id) 

     # Testing if the currently logged in user is 
     # the same as the user that created the 'app': 

     if request.user.id == app.user.user.id: 
      if request.method == 'POST': 
       form = AppForm(request.POST, instance=app) 
       if form.is_valid(): 
        edited_app = form.save() 
        return HttpResponseRedirect('/thanks/') 
      else: 
       form = AppForm(instance=app) 

     # If 'app' does not belong to logged in user, redirect to 'accessdenied' page: 

     else: 
      return HttpResponseRedirect('/accessdenied/') 
    except LeaveApp.DoesNotExist: 
     raise Http404 
    return render(request, 'AppDetail.html', {'form':form}) 

它的工作原理,但我想知道如果有一個更普遍接受和/或安全的方式來做到這一點?

+1

不,它的罰款。 – freakish

回答

1

這被稱爲行級權限,這是一個非常普遍的問題。有關解決此問題的所有應用程序,請參閱here

如果您需要完成特定的測試,請選擇像您一樣的自定義解決方案(不過,因爲它是樣板文件,所以最好將其移至裝飾器中)。否則,只需使用現有的應用程序。

1

我會把表單提交到不同的視圖中,並編寫一個自定義裝飾器,您也可以使用它來解決類似的問題。 我也會返回一個404而不是訪問被拒絕。您可能不想向用戶顯示您正在保護某些內容。

1

有一個名爲user_passes_test限制訪問基於視圖裝飾,如果用戶在事件經過一定的檢查

from django.contrib.auth.decorators import login_required, user_passes_test 

@login_required 
@user_passes_test(lambda user: user.username == app.user.user.id) 
MyView(request): 
    ... 

您還可以添加一個可選的參數的URL重定向到他們檢查失敗。

試圖從管理頁面做到這一點也很容易,但需要一些額外的步驟。

Docs Here