如何动态创建django组和处理权限

时间:2013-04-26 10:35:00

标签: django django-permissions

我正在使用django-userena应用程序来处理用户注册,用户配置文件和登录。现在我正在编写一个应用程序 -

  1. 用户可以创建课程(课程就像我们存储课程信息的个人资料)。
  2. 其他用户可以注册此课程。注册需要课程创建者的批准。
  3. 只有课程创建者才能编辑课程页面,他可以为课程创建作业。
  4. 所有注册课程的用户都可以查看课程页面和课程作业(只读)。
  5. 课程创建者可以向其他用户提供编辑课程所有作业的权限。
  6. 一种方法是 - 创建两个组创建者和修饰符。现在创建者组可以编辑课程页面,修改者的成员可以修改该特定课程的作业。这个解决方案的问题是,一旦我们将用户添加到创建者组,它就会自动获得编辑所有课程的权限。类似地,修饰符组的成员可以编辑所有课程的所有作业。这不是必需的。

    我应该如何构建这个应用程序?

3 个答案:

答案 0 :(得分:1)

另一种选择是django-authority,它可以通过方法动态检查权限,而不是将它们保存在数据库中。

Django-guardian的区别在于,在您的示例中,当用户移动到另一个课程时,您必须取消分配旧组的权限并明确指定新组。

使用权限,函数can_edit_course(user, course)(伪代码)和在运行时决定的访问。

答案 1 :(得分:0)

您基本上想要的是行级权限。

您可以从row level permissions in django

获得一些想法

其他方式是您可以在模型Course上保留两个字段..

class Course(models.Model):
    creator = models.ForeignKey(User)
    modifiers = models.ManyToManyField(User)

因此,检查用户是否是创建者,然后只允许编辑课程。

检查用户是否在course.modifiers.all(),然后允许他修改。

创作者可以访问另一个页面,在那里可以添加课程的修饰符。

答案 2 :(得分:0)

您可以为每个课程附加两个不同的组,并在创建课程时创建它们:

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)