【问题标题】:How can I structure Django permissions to have multiple categories of permissions groups?如何构建 Django 权限以拥有多个类别的权限组?
【发布时间】:2019-11-18 12:24:08
【问题描述】:

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

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

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

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

想法 1:

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

想法 2:

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

【问题讨论】:

  • 我在我的大学项目中使用了想法 2,它运行良好。在我的案例中,有 3 种不同类型的用户,管理员,我使用了 Django 已经在用户模型中提供的标准管理员字段,医生模型和专业模型,医生和专业人士都在不同的组中,并且他们有对象权限, 没有人可以删除一些受保护的模型,只有Admin用户可以删除,Professional不能编辑对象,只能创建和可视化(Get)。

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


【解决方案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 添加到您的敏感信息模型中。与上面的第二种解决方案类似,您可以在运行时通过依赖当前信息的标签手动进行对象级权限。

【讨论】:

    猜你喜欢
    • 2018-12-10
    • 2012-06-21
    • 2010-11-10
    • 2014-09-13
    • 2019-09-15
    • 1970-01-01
    • 2022-11-07
    • 2013-09-18
    • 2021-05-05
    相关资源
    最近更新 更多