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,]