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

时间:2019-07-09 01:14:22

标签: django django-rest-framework django-permissions

我想使用Django Rest Framework对API拥有多层权限,我如何才能最好地实现这一目标?

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

  • 角色:模型级别的访问权限,例如管理员和不同的客户类型。
  • GroupAccess:每个对象的组访问权限,例如一组用户。
  • 灵敏度:每个对象,其他用于敏感信息的标签。

后两个类别在所有模型中均适用,最好不要为每个模型使用单独的权限。

想法1:

为从标准django auth组继承的每个类别创建模型。将它们作为代理组进行处理,以使我的代码在逻辑上有所不同,但应尽可能与标准授权保持一致。然后使用django-guardian启用对象级别权限。

想法2:

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

1 个答案:

答案 0 :(得分:1)

我最近设计了这样的架构,所以我想到的第一件事就是这样:

  1. 角色:您可以通过添加以下角色级别的选择来覆盖django的内置AbstractUser类:
# 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内置的Group模型,并将ForeignKey放入Team模型中,并手动执行对象级权限。
# 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添加到您的敏感信息模型中。与上面的第二种解决方案类似,您可以在运行时依靠当前信息的标签手动执行对象级权限。