认证Authentication
DRF框架的默认全局认证方案如下:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication', # session认证
'rest_framework.authentication.BasicAuthentication', # 基本认证
)
}
也可以在每个视图中通过设置authentication_classess属性来设置视图的认证方案:
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.views import APIView
class ExampleView(APIView):
authentication_classes = (SessionAuthentication, BasicAuthentication)
...
配合权限,如果认证失败会有两种可能的返回值:
- 401 Unauthorized 未认证
- 403 Permission Denied 权限被禁止
权限Permissions
权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。
- 在执行视图的dispatch()方法前,会先进行视图访问权限的判断
- 在通过get_object()获取具体对象时,会进行对象访问权限的判断
提供的权限
DRF框架提供了四个权限控制类:
- AllowAny 允许所有用户
- IsAuthenticated 仅通过认证的用户
- IsAdminUser 仅管理员用户
- IsAuthenticatedOrReadOnly 认证的用户可以完全操作,否则只能get读取
使用
DRF框架的默认权限控制如下:
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny', # 允许所有人
)
可以在配置文件中设置权限管理类,如:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated', # 允许认证用户
)
}
也可以在具体的视图中通过permission_classes属性来指定某个视图所使用的权限控制类,如:
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
class ExampleView(APIView):
permission_classes = [IsAuthenticated]
...
举例
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import ReadOnlyModelViewSet
class BookInfoViewSet(ReadOnlyModelViewSet):
# 指定当前视图所使用的查询集
queryset = BookInfo.objects.all()
# 指定当前视图所使用的序列化器类
serializer_class = BookInfoSerializer
# 指定当前视图所使用的认证类
authentication_classes = [SessionAuthentication]
# 指定当前视图所使用的权限控制类
permission_classes = [IsAuthenticated]
自定义权限
如需自定义权限,需继承rest_framework.permissions.BasePermission父类,并实现以下两个任何一个方法或全部
-
.has_permission(self, request, view)
是否可以访问视图, view表示当前视图对象
-
.has_object_permission(self, request, view, obj)
是否可以访问数据对象, view表示当前视图, obj为数据对象
例如:
class MyPermission(BasePermission):
def has_permission(self, request, view):
"""判断对使用此权限类的视图是否有访问权限"""
# 任何用户对使用此权限类的视图都没有访问权限
return True
def has_object_permission(self, request, view, obj):
"""判断对使用此权限类视图某个数据对象是否有访问权限"""
# 需求: 对id为1,3的数据对象有访问权限
if obj.id in (1, 3):
return True
return False
class BookInfoViewSet(ReadOnlyModelViewSet):
# 指定当前视图所使用的查询集
queryset = BookInfo.objects.all()
# 指定当前视图所使用的序列化器类
serializer_class = BookInfoSerializer
# 指定当前视图所使用的认证类
authentication_classes = [SessionAuthentication]
# 使用自定义的权限控制类
permission_classes = [MyPermission]
限流Throttling
可以对接口访问的频次进行限制,以减轻服务器压力。
使用
DRF框架默认没有进行全局限流设置,可以在配置文件中,使用DEFAULT_THROTTLE_CLASSES
和 DEFAULT_THROTTLE_RATES
进行全局配置。
可选限流类
1) AnonRateThrottle
限制所有匿名未认证用户,使用IP区分用户。
使用DEFAULT_THROTTLE_RATES['anon']
来设置频次
2)UserRateThrottle
限制认证用户,使用User id 来区分。
使用DEFAULT_THROTTLE_RATES['user']
来设置频次
3)ScopedRateThrottle
限制用户对于每个视图的访问频次,使用ip或user id。
限流设置
1)针对匿名用户和认证用户分别进行限流控制
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
# 针对未登录(匿名)用户的限流控制类
'rest_framework.throttling.AnonRateThrottle',
# 针对登录(认证)用户的限流控制类
'rest_framework.throttling.UserRateThrottle'
),
# 指定限流频次
'DEFAULT_THROTTLE_RATES': {
# 认证用户的限流频次
'user': '5/minute',
# 匿名用户的限流频次
'anon': '3/minute',
},
}
DEFAULT_THROTTLE_RATES
可以使用 second
, minute
, hour
或day
来指明周期。
也可以在具体视图中通过throttle_classess属性来配置,如
from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView
class ExampleView(APIView):
throttle_classes = [UserRateThrottle]
...
2)针对匿名用户和认证用户进行统一的限流控制
REST_FRAMEWORK = {
# 针对匿名用户和认证用户进行统一的限流控制
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.ScopedRateThrottle',
),
# 指定限流频次选择项
'DEFAULT_THROTTLE_RATES': {
'upload': '3/minute',
'contacts': '5/minute'
},
}
例如:
class ContactListView(APIView):
throttle_scope = 'contacts'
...
class ContactDetailView(APIView):
throttle_scope = 'contacts'
...
class UploadView(APIView):
throttle_scope = 'uploads'
...