2012-12-14 142 views
1

我有一个组织员工车型Django的验证,用户和权限

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

回答

4

总而言之,你没事。

因为:

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

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

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

编辑:

有组织的自定义权限也是可能的,如果你创建权限可能是最好的ogramatically,像手册中提到,这种方式:

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的权威性善于分配静态权限的用户,gropu或“曲线”的对象。最终对您的应用意味着什么取决于您。

因此,在这种情况下,较好的解决办法是有一个固定的一套类似的权限“可以查看自己的文档”或“可以查看组织的文件”分配给用户/组。你的应用程序应该决定它的含义并提供相应的文档,在帐户中使用运行时状态或使用模型结构来确定要提供的正确数据集。

+0

那么每个组织的权限呢? –

+0

不确定我们是否在同一页上。你的组织需要单独的权限树吗?如果是这样,django auth将不支持这种开箱即用的行为,因为django.contrib.auth的目标是用户登录及其权限。另一方面,为任何其他模型创建许可系统不应该很复杂。这只是多对多的,我会创建一个简单的注释助手来检查组织权限。 –

+0

我需要适用于公司的权限,而不是用户。我需要一个单独的权限树吗? –