Django Auth,用户和权限

时间:2012-12-14 11:24:37

标签: django permissions

我有组织员工模型

class Organization(models.Model):

    is_active = models.BooleanField()
    name = models.CharField(u'Name', max_length = 255)
    ...

class Employee(models.Model):
    user = models.OneToOneField(User)
    organization = models.ForeignKey(Organization)
    ...

如果我使用 AUTH_PROFILE_MODULE 会不会好,那么员工会成为用户个人资料?

这样我就可以使用Django权限系统来设置员工权限,比如

  • 可以查看所有文件
  • 可以看到自己的组织文件
  • 可以看到自己的文件

是否可以拥有不像“可以查看所有文档”这样的全局权限?

如果我还希望每个组织拥有一个权限呢?这该怎么做?以及如何区分每个组织和每个员工的权限?

编辑:我正在使用Django 1.4

1 个答案:

答案 0 :(得分:4)

简而言之,是的,你没事。

由于:

1)使用AUTH_PROFILE_MODULE = Employee将使Employee实例以这种方式可用:

def view(request):
    employee_instance = request.user.get_profile()

2)使用自定义权限很简单,请参阅:https://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions

编辑:

也可以在组织上拥有自定义权限,如果以编程方式创建权限(如手册中提到的那样),这可能是最好的方式:

content_type = ContentType.objects.get(app_label='myapp', model='Organization')
permission = Permission.objects.create(codename='can_do_something', name='Can Do something',
                                       content_type=content_type)

现在,您拥有权限感知组织模型,您只需将其分配给您的用户。

澄清更多:

Django auth系统是一种固定的ACL。您将角色分配给用户(或组),这就是它。 Django提供帮助包装器功能,可以轻松过滤掉没有给定权限的用户。如果您需要在运行时和/或以更通用的方式决定,对象是否有权执行某些操作,您需要完整的ACL系统(并且django.auth不是),或者您自己编写这种行为。这取决于您的需求,显然需要管理这些权限。在OP的情况下,行为是固定的,因此我建议只对其进行编码并感到高兴。但需求可能会有所不同,解决方案也是如此。 Django auth擅长为用户,gropu或“profile”对象分配静态权限。这对您的应用程序意味着什么最终取决于您。

因此,在这种情况下,良好的解决方案是拥有一组固定的权限,例如“可以查看自己的文档”或“可以查看组织文档”,分配给用户/组。并且您应该决定,它意味着什么并相应地提供文档,在帐户中采用运行时状态或使用模型结构来确定要服务的正确数据集。