我如何使用Django组和权限?

TIM*_*MEX 79 python django django-permissions

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

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

Ale*_*uhl 117

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

对于模型权限,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" ),
        )
Run Code Online (Sandbox Code Playgroud)

请注意,权限是一组元组,其中元组项是上述权限以及该权限的说明.您不必遵循permname_modelname约定,但我通常坚持使用它.

最后,要检查权限,可以使用has_perm:

obj.has_perm( 'drivers.read_car' )
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

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

result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )
Run Code Online (Sandbox Code Playgroud)

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

  • 这是权限的一个很好的答案,但几乎没有涉及组和他们如何在Django中工作? (25认同)
  • 群组并不是很多,它们主要用于将用户捆绑在一起以应用权限,就像Linux用户组一样.您向组授予权限,并将其扩展到该组的所有成员.文档说明了这一切:https://docs.djangoproject.com/en/dev/topics/auth/default/#groups. (4认同)