我正在构建 Django REST 作为后端,Angular JS 作为前端。
现在我拥有非常先进的 3 级权限系统
class UserSerializer(serializers.Serializer):
email = serializers.EmailField()
username = serializers.CharField(max_length=100)
field1 = serializers.CharField(max_length=100)
field2 = serializers.CharField(max_length=100)
field3 = serializers.CharField(max_length=100)
field4 = serializers.CharField(max_length=100)
现在想要权限
User Role
view
READ / Write / Update /Delete
有 10 个 Angular 色,30 个 View ,如 /user/view1
/user/view2
然后 READ 或 write like
这些是字段级别的权限,例如
Field1 can be READ by Manager level on view 1
Field1 can be Edit by Manager level on view 2
Feild1 can be Delete by Admin on View 1
我很困惑我怎么会有那种权限模型。
最佳答案
我通常会为这些情况推荐不同的序列化程序类,但这会限制您的读写权限(某种程度上)并且可能无法完全满足您的需求。
您将为每个权限级别创建一个序列化程序。假设存在三个权限级别:Admin、Manager、Normal user。
class NormalUserSerializer(ModelSerializer):
email = serializers.EmailField(read_only=True, required=True)
username = serializers.CharField(max_length=100, read_only=True)
class Meta:
fields = ("email", "username", )
class ManagerUserSerializer(NormalUserSerializer):
email = serializers.EmailField(read_only=False, required=True)
username = serializers.CharField(max_length=100, read_only=False)
class AdminSerializer(ManagerUserSerializer):
email = serializers.EmailField(read_only=False, required=False)
username = serializers.CharField(max_length=100, read_only=False)
这会将普通用户限制为字段的只读 View (read_only
由 DRF 强制执行)。对于管理者来说,他们有读写字段的能力,但是他们不能清除email
字段的内容(由required
强制执行)。管理员能够读取和写入所有字段,以及清除 email
字段的内容。
然后您的 View 将根据经过身份验证的用户的 Angular 色在 get_serializer_class
中返回正确的序列化程序类。
class UserViewSet(ModelViewSet):
def get_serializer_class(self):
if self.request.user.is_superuser:
return AdminUserSerializer
if self.request.user.is_staff:
return ManagerUserSerializer
return NormalUserSerializer
另一种选择是强制执行 validate
方法中的所有内容,并在序列化程序的 to_native
方法中手动删除字段。如果您可以忍受为每个 Angular 色创建一个序列化程序,那么这是在 Django REST Framework 中对各个字段实现基于 Angular 色的权限的最简单且(可以说)最干净的方法。
关于python - 如何处理 Django REST 框架中字段的 3 级权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27211956/