2011-01-24 31 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