您的位置:首页 > 其它

DRF内置权限组件之自定义权限管理类

2020-08-12 11:24 435 查看

DRF内置权限组件permissions

权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。

  • 在执行视图的dispatch()方法前,会先进行视图访问权限的判断
  • 在通过get_object()获取具体对象时,会进行模型对象访问权限的判断

在settings.py中设置DRF内置的权限组件的配置信息:

DRF提供了四种权限划分

REST_FRAMEWORK = {
...
'DEFAULT_PERMISSION_CLASSES': (

# 一、默认用户对所有的业务都有操作权限,即没有权限限制(未指明时默认的权限)
'rest_framework.permissions.AllowAny',

# 二、仅通过认证的用户才可以访问项目中的接口
'rest_framework.permissions.IsAuthenticated',

# 三、仅管理员用户(可以通过admin创建一个用户进行测试)
'rest_framework.permissions.IsAdminUser',

# 四、未认证的用户只有查权限,经过认证的用户才有增删改的权限
'rest_framework.permissions.IsAuthenticatedOrReadOnly',

),

}

以上这种全局配置方式,表示用户在访问项目中的所有接口时都有权限限制。

当然,我们可以进行局部配置,在指定的类视图中通过

permission_classes
属性配置权限管理类

permission_classes = [IsAuthenticated, ]

from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated

class ExampleView(APIView):

permission_classes = [IsAuthenticated,]

自定义权限管理类

如需自定义权限,需继承

rest_framework.permissions.BasePermission
父类,并实现以下两个任何一个方法或全部

  • .has_permission(self, request, view)

    是否可以访问视图, view表示当前视图对象

  • .has_object_permission(self, request, view, obj)

    是否可以访问数据对象, view表示当前视图, obj为数据对象

例如:

在当前子应用下的utils文件夹中,创建一个权限文件permissions.py中声明自定义权限类:

from rest_framework.permissions import BasePermission

class IsXiaoMingPermission(BasePermission):

def has_permission(self, request, view):

print(request)  # 局部配置下的打印结果:<rest_framework.request.Request object at 0x112041c50>

print(view)     # 局部配置下的打印结果:<four.views.StudentViewSet object at 0x111f8a110>

if( request.user.username == "xiaoming" ):

return True

全局配置

用户在访问项目中的所有接口时都有

IsXiaoMingPermission
此权限管理限制。

REST_FRAMEWORK = {
...
'DEFAULT_PERMISSION_CLASSES': (
'four.utils.permissions.IsXiaoMingPermission',
)
...
}

局部配置

from four.utils.permissions import IsXiaoMingPermission

class StudentViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerializer

permission_classes = [IsXiaoMingPermission,]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: