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

标签 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 个 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/

相关文章:

javascript - Angularjs ng-repeat创建多个表单

python - 为什么嵌入 Flask 应用程序时不显示此 Bokeh 图?

python - 当 2 个单元格在另一个数据框中显示相同时选择行

python - 值的日期格式无效。必须采用 YYYY-MM-DD 格式

python - Celery:运行具有 super 用户权限的 worker

Django 测试客户端响应包含空模板列表?

javascript - 如何抑制 jsHint 消息说 app 从未在我的 AngularJS 应用程序中使用?

python - anaconda 和点云库

Django模板上下文函数不自动运行

angularjs - 使用 AngularJS 和 ng-repeat 有效地更新列表很重要