我想使用Django Rest Framework对API拥有多层权限,我如何才能最好地实现这一目标?
具体地说,我拥有的三类授权是:
后两个类别在所有模型中均适用,最好不要为每个模型使用单独的权限。
想法1:
为从标准django auth组继承的每个类别创建模型。将它们作为代理组进行处理,以使我的代码在逻辑上有所不同,但应尽可能与标准授权保持一致。然后使用django-guardian启用对象级别权限。
想法2:
将标准组用作角色,并根据这些组分配模型级别权限。对于对象级权限,请在Django Rest Framework中编写一个自定义权限类,以针对用户检查对象级权限。
答案 0 :(得分:1)
我最近设计了这样的架构,所以我想到的第一件事就是这样:
# 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'
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
# ...
Tag
模型并将其作为ManyToManyField添加到您的敏感信息模型中。与上面的第二种解决方案类似,您可以在运行时依靠当前信息的标签手动执行对象级权限。