我如何使用Django组和权限?

时间:2011-01-24 04:36:13

标签: python django django-permissions

我理解基本的用户资料。我知道身份验证,登录,创建帐户等。但现在我想处理群组和权限。

django群组/权限的文档在哪里?这不是它:http://docs.djangoproject.com/en/dev/topics/auth/

1 个答案:

答案 0 :(得分:115)

我想你需要问的第一个问题是你需要什么权限以及什么类型的权限。通过什么类型,我的意思是你想要模型或对象级别。澄清差异说你有一个模型车。如果您想要授予所有汽车的权限,那么模型级别是合适的,但如果您想要基于每个汽车授予权限,则需要对象级别。您可能需要两者,这不是问题,我们会看到。

对于模型权限,Django主要为您处理这些问题。对于每个模型,Django将以“appname.permissionname_modelname”的形式创建权限。如果您有一个名为'drivers'的应用程序与Car模型,那么一个权限将是'drivers.delete_car'。 Django自动创建的权限将是创建,更改和删除。由于某些奇怪的原因,他们决定不包括CRUD的读取权限,您必须自己做。请注意,由于某种原因,Django决定将CRUD的“更新”更改为“更改”。要向模型添加更多权限(例如读取权限),请使用Meta类:

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

如果实体是检查(组或用户)权限的对象,则model是模型的实例,perms是要检查的字符串的权限列表(例如['read','change']),以及app是一个字符串的应用程序名称。要像上面的has_perm一样进行检查,你可以这样调用:

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

如果你需要使用对象或行权限(它们意味着相同的东西),那么Django本身并不能真正帮助你。好处是你可以并排使用模型和对象权限。如果你想要对象权限,你必须write your own(如果使用1.2+)或找到别人写的项目,我喜欢的是来自华盛顿时代的django-objectpermissions