【问题标题】:Django Auth, Users and PermissionsDjango 身份验证、用户和权限
【发布时间】:2012-12-02 09:35:07
【问题描述】:

我有一个组织员工模型

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

【问题讨论】:

    标签: django permissions


    【解决方案1】:

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

    因为:

    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 擅长将静态权限分配给用户、组或“配置文件”对象。这对您的应用意味着什么最终取决于您。

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

    【讨论】:

    • 那么每个组织的权限呢?
    • 不确定我们是否在同一页面上。您的组织需要单独的权限树吗?如果是这样,django auth 将不支持这种开箱即用的行为,因为 django.contrib.auth 是针对用户登录及其权限的。另一方面,为任何其他模型创建权限系统不应该很复杂。这只是多对多,我会创建一个简单的注释助手来检查组织权限。
    • 我需要适用于公司而不是用户的权限。我需要一个单独的权限树吗?
    • 嗯,django 使用的权限系统本质上是静态的。在我看来,您需要根据用户是否属于组织来评估用户在运行时访问任何给定文档的权限。那不是我会使用权限系统的东西。 AFAIK,您需要自己编写代码。或者更好的是,您将静态权限用于以下想法:该用户是经理,他可以看到所有内容,该用户是员工,他只能看到自己的文档。在运行时,根据这个“全局”权限,您决定要显示哪些文档。
    • 对“经理”和“员工”以及“可以查看所有内容”、“可以查看他自己的文档”的权限使用组是否更好?而在什么情况下使用django权限系统不好呢?
    猜你喜欢
    • 1970-01-01
    • 2021-03-10
    • 2011-06-26
    • 2014-01-11
    • 2017-05-05
    • 1970-01-01
    • 2015-05-12
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多