如何使用Django组和权限?


Answers:


121

我想您需要问的第一个问题是您需要什么权限以及什么样的权限。我说的是哪种类型,您想要模型级别还是对象级别。为了澄清差异,假设您有一辆汽车模型。如果要授予所有汽车的权限,则“模型”级别是合适的,但是如果要按汽车授予权限,则需要“对象”级别。您可能同时需要这两个,这不是问题,我们将看到。

对于模型权限,Django主要为您处理这些权限。Django将为每个模型以“ appname.permissionname_modelname”形式创建权限。如果您有一个带有Car模型的名为“ drivers”的应用程序,则一个权限为“ 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是User或Group实例。我认为为此编写一个函数更简单:

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本身并不能真正为您提供帮助。令人高兴的是,您可以同时使用模型和对象权限。如果您想要对象权限,则必须自己编写(如果使用1.2+)或找到其他人编写的项目,我喜欢的一个是华盛顿时间的django-objectpermissions


27
对于权限,这是一个很好的答案,但是几乎不涉及组及其在Django中的工作方式?
NotSimon

4
组没有很多,它们主要是用于将用户捆绑在一起以应用权限,就像Linux用户组一样。您授予组权限,该权限将扩展到该组的所有成员。该文档确实说明了一切:docs.djangoproject.com/en/dev/topics/auth/default/#groups
Alex Kuhl 2013年

1
我不得不在这里指出您要考虑使用django Guardian。请在此处查看授权包明细。此外,此SOF链接也提供了很好的比较。
杰夫·谢菲尔德

1
当我遇到这个问题并需要对象权限时,我找到了django-guardian:django-guardian.readthedocs.org/en/v1.2
dArignac 2014年

1
“自己动手写”已经结束。或者其他的东西。现在是中文。
威廉·卡尔森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.