【问题标题】:how to create django groups and handle permission dynamically如何创建 django 组并动态处理权限
【发布时间】:2013-04-26 10:35:00
【问题描述】:
我正在使用django-userena 应用程序来处理用户注册、用户配置文件和登录。现在我正在编写一个应用程序 -
- 用户可以创建课程(课程就像我们存储课程信息的个人资料)。
- 其他用户可以注册本课程。注册需要课程创建者的批准。
- 只有课程创建者可以编辑课程页面,并且可以为课程创建作业。
- 所有注册课程的用户都可以看到课程页面和课程分配(只读)。
- 课程创建者可以向其他用户提供编辑课程所有作业的权限。
一种出路是——创建两个组创建者和修改者。现在创建者组可以编辑课程页面,修改者的成员可以修改该特定课程的分配。这个解决方案的问题是,一旦我们将用户添加到创建者组,它就会自动获得编辑所有课程的权限。同样,修改组的成员可以编辑所有课程的所有作业。这不是必需的。
我应该如何构建这个应用程序?
【问题讨论】:
标签:
django
django-permissions
【解决方案1】:
另一种方法是django-authority,它可以通过方法动态检查权限,而不是将它们持久化在数据库中。
在您的示例中,Django-guardian 的不同之处在于,当用户转到另一门课程时,您必须取消分配旧组的权限并明确分配新组。
有权限,一个函数can_edit_course(user, course)(伪代码)和运行时决定的访问权限。
【解决方案2】:
您可以将两个不同的组附加到每个课程,并在创建课程时创建它们:
class Course(models.Model):
creators = models.ForeignKey(Group)
modifiers = models.ForeignKey(Group)
因此,您可以通过这种方式为该组设置权限。您可以使用django-guardian 分配和检查此权限。
像这样的:
assign_perm('edit_course', group, course)
然后检查用户是否可以编辑此课程(它会自动检查用户组的组权限)
user.has_perm("edit_course",course)
【解决方案3】:
你基本上想要的是行级权限。
你可能会从row level permissions in django得到一些想法
另一种方法是您可以在模型上保留两个字段Course..
class Course(models.Model):
creator = models.ForeignKey(User)
modifiers = models.ManyToManyField(User)
所以,检查用户是否是创建者,然后只允许编辑课程。
检查用户是否在course.modifiers.all(),然后允许他修改。
创作者可以访问另一个页面,在该页面中可以为课程添加修饰符。