如何在Django REST框架中处理字段的3级权限

时间:2014-11-30 09:47:37

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

我正在构建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个角色,30个视图,如/user/view1 /user/view2,然后阅读或写作

这些是字段级权限,如

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

我很困惑,我怎么能拥有那种权限模型。

2 个答案:

答案 0 :(得分: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)

这会将普通用户限制为字段的只读视图(DRF强制执行read_only)。对于经理来说,他们有能力读取和写入字段,但他们无法清除email字段的内容(由required强制执行)。管理员可以读取和写入所有字段,并清除email字段的内容。

然后,您的视图将根据经过身份验证的用户的角色在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方法中的字段。如果您可以为每个角色创建一个序列化程序,那么它是在Django REST Framework中对各个字段实现基于角色的权限的最简单且(可以说)最干净的方法。

答案 1 :(得分:0)

我和客户端有完全相同的问题。我创建了django-rest-framework-roles来自动参数化用户类型的给定DRF方法(例如:get_queryset,get_serializer_class)。这样,您就不必在用户类型上重复输入条件块。

我想扩展库以处理您描述的更复杂的权限问题。我遇到了同样的挑战,例如:通过角色 HTTP动词参数化。