1

我有一个组织员工模型

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会不会很好,所以 Employee 成为用户个人资料?

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

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

是否可以拥有非全局权限,例如“可以查看所有文档”?

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

编辑:我正在使用 Django 1.4

4

1 回答 1

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 身份验证系统是一种固定的 ACL。您将角色分配给用户(或组),仅此而已。Django 提供了辅助包装功能,可以轻松过滤掉没有给定权限的用户。如果您需要在运行时和/或更通用的方式决定一个对象是否有权做某事,您要么需要完整的 ACL 系统(而 django.auth 不是),要么您自己编写这种行为。这取决于您的需求,并且显然取决于管理这些权限的需要。在 OP 的情况下,行为是固定的,因此我建议只编写代码并感到高兴。但是需求可能会有所不同,解决方案也会有所不同。Django auth 擅长将静态权限分配给用户、组或“配置文件”对象。这对您的应用意味着什么最终取决于您。

所以在这种情况下,好的解决方案是拥有一组固定的权限,例如分配给用户/组的“可以查看自己的文档”或“可以查看组织文档”。您的应用程序应该决定它的含义并相应地提供文档,在帐户中获取运行时状态或使用模型结构来确定要提供的正确数据集。

于 2012-12-14T11:27:09.443 回答