【问题标题】:How to set up django user permissions with one user having multiple permissions?如何设置一个用户拥有多个权限的 django 用户权限?
【发布时间】:2018-12-10 01:45:09
【问题描述】:

我有以下想法。一个用户可以在多个公司。用户在他或她所在的每个公司都有不同的权限。 下面的示例不起作用,因为一个用户始终拥有相同的权限。

我应该如何设置我的用户模型,让一个用户在每家公司拥有不同的权限?

这就是我到目前为止所尝试的:

class User(AbstractUser):
    hourly_wage = models.DecimalField(decimal_places=2, max_digits=6, default=8.50)

    class Meta:
        permissions = (("is_general", "Can add people to his company and see everything"),
                       ("is_captain", "Can add/edit/delete everything"),
                       ("is_staff", "Can add/edit/delete jobs"),
                       ("is_programmer", "Can do what he or she wants to do"))

    def clean(self):
        self.username = self.username.lower()


class Company(models.Model):
    name = models.CharField(max_length=80)
    slug = models.SlugField(unique=True)
    users = models.ManyToManyField(User, related_name="companies")

    class Meta:
        verbose_name_plural = "companies"

【问题讨论】:

    标签: django django-models user-permissions django-users


    【解决方案1】:

    您为ManyToManyField定义一个模型,多对多关系通过该模型流动。

    所以而不是:

    +---------+ M      N +-------------+ M      N +------------+
    | Company |----------| User        |----------| Permission |
    +---------+          +-------------+          +------------+
                         | permissions |
                         +-------------+
    

    因此我们这样写:

    +---------+ 1      N +-------------+ M      1 +------+
    | Company |----------| UserCompany |----------| User |
    +---------+          +-------------+          +------+
                                | M
                                |
                                | N
                         +------------+
                         | Permission |
                         +------------+
    

    我们可以这样做:

    from django.contrib.auth.models import Permission
    
    class User(AbstractUser):
    
        def clean(self):
            self.username = self.username.lower()
    
    
    class Company(models.Model):
        name = models.CharField(max_length=80)
        slug = models.SlugField(unique=True)
        users = models.ManyToManyField(User, through='app.CompanyUser', related_name="companies")
    
        class Meta:
            verbose_name_plural = "companies"
    
    
    class CompanyUser(models.Model):
    
        user = models.ForeignKey('app.User', on_delete=models.CASCADE)
        company = models.ForeignKey('app.Company', on_delete=models.CASCADE)
        hourly_wage = models.DecimalField(decimal_places=2, max_digits=6, default=8.50)
        permissions = models.ManyToManyField(Permission, on_delete=models.CASCADE)

    您可能希望将其他逻辑转移到 through 模型。例如,hourly_wage 可能也与 (User, Company) 对相关,而不是特定于 User 本身。

    因此,您可以通过以下方式向UserCompany 添加权限:

    someusercompany.permissions.add(some_permission)
    

    然后您检查UserCompany 是否具有以下权限:

    CompanyUser.objects.filter(
        user=some_user,
        company=some_company,
        some_permission=some_permission
    ).exists()
    

    documentation about through parameter [django-doc] 中查看更多信息。

    【讨论】:

    • 我现在有了这个结构,但是如何为 CompanyUser 实例分配权限?
    • @Daniel:抱歉,这需要一些更改,更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2015-05-18
    • 2019-11-18
    • 1970-01-01
    • 2020-11-23
    • 2015-08-01
    • 2014-09-11
    • 1970-01-01
    • 2019-07-25
    相关资源
    最近更新 更多