【问题标题】:how to create django groups and handle permission dynamically如何创建 django 组并动态处理权限
【发布时间】:2013-04-26 10:35:00
【问题描述】:

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

  1. 用户可以创建课程(课程就像我们存储课程信息的个人资料)。
  2. 其他用户可以注册本课程。注册需要课程创建者的批准。
  3. 只有课程创建者可以编辑课程页面,并且可以为课程创建作业。
  4. 所有注册课程的用户都可以看到课程页面和课程分配(只读)。
  5. 课程创建者可以向其他用户提供编辑课程所有作业的权限。

一种出路是——创建两个组创建者和修改者。现在创建者组可以编辑课程页面,修改者的成员可以修改该特定课程的分配。这个解决方案的问题是,一旦我们将用户添加到创建者组,它就会自动获得编辑所有课程的权限。同样,修改组的成员可以编辑所有课程的所有作业。这不是必需的。

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

【问题讨论】:

    标签: 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(),然后允许他修改。

        创作者可以访问另一个页面,在该页面中可以为课程添加修饰符。

        【讨论】:

          猜你喜欢
          • 2018-01-31
          • 2013-09-18
          • 2023-03-28
          • 2022-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-12
          • 1970-01-01
          相关资源
          最近更新 更多