如何构造 Django 权限以具有多个类别的权限组?

How can I structure Django permissions to have multiple categories of permissions groups?

我想使用 Django Rest Framework 为 API 设置多层权限,我怎样才能最好地实现这一点?

具体来说,我拥有的三类授权是:

后两个类别同样适用于所有模型,最好不要为每个模型单独授予权限。

想法 1:

为每个继承自标准 django 授权组的类别创建一个模型。将这些作为代理组执行,在我的代码中逻辑上不同,但尽可能与标准授权一致。然后使用django-guardian开启对象级别的权限。

想法 2:

使用角色的标准组并根据这些组分配模型级别的权限。对于对象级权限,在 Django Rest Framework 中编写自定义权限 类 以检查用户的对象级权限。

我最近设计了这样一个架构,所以我首先想到的是这样的:

  1. 角色:您可以通过添加 role-level 选择来覆盖 django 的 built-in AbstractUser class,例如:
# models.py
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    """Custom user model with an extra type field"""
    SUPER_USER = 1
    OTHER_ROLE = 2
    SOME_OTHER_ROLE = 3

    USER_TYPE_CHOICES = (
        (SUPER_USER, 'Super user'),
        (OTHER_ROLE, 'Other role'),
        (SOME_OTHER_ROLE, 'Some other role'),
    )

    user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES)

# -------------------------------------------------------------------------

# Don't forget to set this User model as your default model
# settings.py
AUTH_USER_MODEL = 'my_app.User'

  1. 您可以使用 django 的 built-in Group 模型并将外键放入您的 Team 模型并手动执行 object-level 权限。
# models.py
from django.contrib.auth.models import Group
from django.db import models

def Team(models.Model):
    group = models.ForeignKey(Group, on_delete=models.CASCADE)

# -------------------------------------------------------------------------

# You can do object-level permission per group by
# ...
if team.group in permitted_groups:
    # permission granted
    pass
else:
    # permission not granted
    pass
# ...
  1. 您可以定义一个 Tag 模型并将其作为 ManyToManyField 添加到您的敏感信息模型中。与上面的第二种解决方案类似,您可以在运行时根据您当前信息的标签手动执行 object-level 权限。