如何构造 Django 权限以具有多个类别的权限组?
How can I structure Django permissions to have multiple categories of permissions groups?
我想使用 Django Rest Framework 为 API 设置多层权限,我怎样才能最好地实现这一点?
具体来说,我拥有的三类授权是:
- 角色:模型级别的访问权限,例如管理员和不同的客户类型。
- GroupAccess:按对象、组访问,例如一组用户。
- 敏感度:每个对象,敏感信息的附加标签。
后两个类别同样适用于所有模型,最好不要为每个模型单独授予权限。
想法 1:
为每个继承自标准 django 授权组的类别创建一个模型。将这些作为代理组执行,在我的代码中逻辑上不同,但尽可能与标准授权一致。然后使用django-guardian开启对象级别的权限。
想法 2:
使用角色的标准组并根据这些组分配模型级别的权限。对于对象级权限,在 Django Rest Framework 中编写自定义权限 类 以检查用户的对象级权限。
我最近设计了这样一个架构,所以我首先想到的是这样的:
- 角色:您可以通过添加 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'
- 您可以使用 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
# ...
- 您可以定义一个
Tag
模型并将其作为 ManyToManyField 添加到您的敏感信息模型中。与上面的第二种解决方案类似,您可以在运行时根据您当前信息的标签手动执行 object-level 权限。
我想使用 Django Rest Framework 为 API 设置多层权限,我怎样才能最好地实现这一点?
具体来说,我拥有的三类授权是:
- 角色:模型级别的访问权限,例如管理员和不同的客户类型。
- GroupAccess:按对象、组访问,例如一组用户。
- 敏感度:每个对象,敏感信息的附加标签。
后两个类别同样适用于所有模型,最好不要为每个模型单独授予权限。
想法 1:
为每个继承自标准 django 授权组的类别创建一个模型。将这些作为代理组执行,在我的代码中逻辑上不同,但尽可能与标准授权一致。然后使用django-guardian开启对象级别的权限。
想法 2:
使用角色的标准组并根据这些组分配模型级别的权限。对于对象级权限,在 Django Rest Framework 中编写自定义权限 类 以检查用户的对象级权限。
我最近设计了这样一个架构,所以我首先想到的是这样的:
- 角色:您可以通过添加 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'
- 您可以使用 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
# ...
- 您可以定义一个
Tag
模型并将其作为 ManyToManyField 添加到您的敏感信息模型中。与上面的第二种解决方案类似,您可以在运行时根据您当前信息的标签手动执行 object-level 权限。