2011-01-24 98 views

回答

102

我想你需要問的第一個問題是你需要什麼權限以及什麼類型。我的意思是你想要模型還是對象級別。爲了弄清楚差異,說你有一輛車。如果你想授予所有車輛的權限,那麼模型級別是適當的,但如果你想在每輛車的基礎上給予權限,你需要對象級別。您可能需要兩者,而這不是我們將要看到的問題。

對於模型權限,Django爲您處理這些...大部分。對於每個模型,Django都將以'appname.permissionname_modelname'的形式創建權限。如果您的汽車模型中有一個名爲'drivers'的應用,那麼其中一個權限就是'drivers.delete_car'。 Django自動創建的權限將是創建,更改和刪除。由於一些奇怪的原因,他們決定不包含來自CRUD的讀取權限,您將不得不自己做這件事。請注意,由於某種原因,Django決定將CRUD的「更新」更改爲「更改」。要添加更多的權限模型,說讀權限,您可以使用元類:

class Car(models.Model): 
    # model stuff here 
    class Meta: 
     permissions = ( 
      ("read_car", "Can read Car"), 
     ) 

注意,權限是一組元組,其中元組項目是如上所述和該權限的描述許可。你不必遵循permname_modelname約定,但我通常堅持它。

最後,檢查權限,你可以使用has_perm:

obj.has_perm('drivers.read_car') 

這裏的obj或者是一個用戶或組的實例。我認爲這是簡單的寫了這樣的功能:

def has_model_permissions(entity, model, perms, app): 
    for p in perms: 
     if not entity.has_perm("%s.%s_%s" % (app, p, model.__name__)): 
      return False 
    return True 

如果實體是檢查(組或用戶)權限的對象,模型是模型的實例,燙髮是權限字符串列表來檢查(例如['read','change']),app是作爲字符串的應用程序名稱。做同樣的支票has_perm上面你會打電話來是這樣的:

result = has_model_permissions(myuser, mycar, ['read'], 'drivers') 

如果您需要使用對象或行權限(它們意味着同樣的事情),那麼Django的不能真正幫助你本身。好的是你可以同時使用模型和對象權限。如果你想獲得對象權限,你將不得不write your own(如果使用1.2+)或找到其他人寫的項目,我喜歡從washingtontimes的django-objectpermissions

+21

這是一個很好的權限答案,但幾乎沒有觸及組,以及它們如何在Django中工作? – Simon 2013-07-22 22:53:09