我工作的一个产品,它允许不同的学校网上管理他们的内容。
这部分涉及设置,我已经写了自己是一个基于角色的访问控制逻辑。 从本质上讲,每个学校都有自己的一套有自己的一套权限的角色。 该软件的用户可以属于多张学校在任何给定的时间不同的角色。
由于种种原因,我想这沟,而是与像一个图书馆使用Django的组和权限一起Django的守护者 。 我现在面临的问题是我应该如何去扩展组模型,这样我可以包括一个外键,每一个新的学校,仍然能够使用在Django的辅助方法,也库,例如Django的监护人。
一个可能的方法,我想出了是简单地创建基于事件的名字群体,如“学校1 - 管理”,“学校1 - 教师”,“学校2 - 管理”,“学校2 - 教师和查询权限的基础上这个代替。 有一个很好的理由,为什么我不应该做这种方式?
经仔细检查,Django的监护人能够解决我的需求。 我写了一篇关于我的全面实施在这里: http://pragmaticstartup.wordpress.com/2012/06/26/django-guardian-a-full-access-control-logic-acl-example/
为什么不能混用两种方法? Django的模型允许的传承 。 首先定义Role
模型,以使角色和办学模式。
然后,您可以继承的新模式django.contrib.auth.Group
说GroupRole。 Django会创建一个新的数据库表为您的模型只包含的属性没有最初组一个ForeignKey与约束相应的组。 更妙的是,你会得到原始组模型的自动反向关系,所以你可以写类似:
class GroupRole(Group):
role = models.ForeignKey(Role)
school = models.ForeignKey(School)
...
g = Group.objects.get(id=1)
# you can access standard group items here g.<attribute> or g.grouprole.<attribute>
# you can access GroupRole attributes by doing g.grouprole.<some_attribute>
GroupRole.objects.filter(role__type='admin', school__location__state='NY')
一个有趣的说明,关系是反射能力,所以这样的事情是,如果没有太大的用处有效:
g.grouprole.grouprole.grouprole.grouprole.role
如果你不具有与之相关联的grouprole代理据点组实例,然后你会得到抛出的异常:
g = Group.objects.create(name='myplaingroup')
try:
print g.grouprole
except GroupRole.DoesNotExist:
print 'This is a normal group'
另外,您可以覆盖这个行为,而不是返回抛出一个异常没有,甚至提供一个默认GroupRole代替。
文章来源: Django Groups and Permissions. Extending Groups to have a FK?