我正在构建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
我很困惑,我怎么能拥有那种权限模型。
答案 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动词参数化。