【问题标题】:Django User "per project" group assignationDjango 用户“每个项目”组分配
【发布时间】:2011-02-27 19:31:02
【问题描述】:

这是我的问题:我的网站有用户,他们可以创建项目并访问其他用户的项目。 每个项目可以为用户分配不同的权限。

所以,我可以有项目 A:用户“John”在组“经理”中,项目“B”用户“约翰”在组“工人”中。

我如何使用 Django 用户身份验证模型来做到这一点?

从 SQL 的角度来看,我希望能够在“auth_user_groups”表的主键中添加“project_id”。

我认为个人资料在这里没有任何帮助。有什么建议吗?

更新:“worker”和“manager”只是我的应用程序定义的权限组(或“角色”)的两个示例。未来还会有更多。例如:我可能还会有“admin”、“reporting”等...

【问题讨论】:

    标签: database django authentication django-authentication


    【解决方案1】:

    如果您确实需要组中的这些信息,我认为最好的解决方案是对必要的模型进行子类化,并从中创建您自己的身份验证应用程序/身份验证后端!

    我不知道是否有必要将项目与组相关联,您还可以创建一个与用户具有 1:1 关系的用户配置文件,并且与项目具有 am:n 关系,因此您可以将项目分配给用户,然后检查您的应用程序用户与哪些项目相关?

    我想到的第三种解决方案是有一个模型,其中一个外键用于项目,一个外键用于组,这也可能对您有用,但可能没有很好的可用性!

    最肮脏的方法可能是使用猴子补丁(add_to_class)将外键添加到组中,但我想这只有在你没有找到另一种下降方式的情况下才值得推荐,并且在某种程度上是你的最后手段,但不是首选!

    【讨论】:

    • 感谢您的评论。我会稍等一下,看看是否有人有更好的解决方案,但我可能会选择你的第一个解决方案(子类化)......我并不真的“需要”在组中,只是用户的权利取决于该项目。您的第二个解决方案意味着复制 Django 已经使用的 auth_group/permission 模型(使用类似 userprofilepermission 的表),只是在“auth_group”表的主键中添加另一个键......我真的希望有一种下降方式来扩展基本身份验证模型除了复制/粘贴。 Django 有如此有限的 auth 模型,真是不可思议。
    【解决方案2】:

    如果您可以在 User 模型中不使用它,并且可以将其作为关联的用户配置文件模型,那么类似:

    from django.contrib.auth.models import User
    from foo.models import Project
    
    class UserProfile(models.Model):
    
      auth_user = models.ForeignKey('User')
      projects_where_manager   = models.ManyToManyField('Project', 
                                                         related_name="managers_for_project")
      projects_where_worker   = models.ManyToManyField('Project', 
                                                         related_name="workers_for_project")
    

    【讨论】:

    • 实际上,“工人”和“经理”只是我的用户所拥有的权利的两个例子。我真的很想使用“auth_group/permission”模型,将组定义为表中的数据而不是列。
    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 2017-09-23
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 2011-02-04
    相关资源
    最近更新 更多