简单理解认证
将请求对象request
和组织好的标识比较,请求和标识一致,认证通过继而进行其他操作,认证失败则被拒绝其他操作。
REST framework自带的认证方式
在前面的学习中所接触到的认证都是基于django自带session
的认证体系的,所以在上一章中,认证的过程是无感的:账号密码正确认证通过,反之不通过。
不过在前后端的开发是基于token
认证的,DRF自带一套token
认证方案,也有其他形式的认证方案,当然也可以自定义,接下来逐一学习。
-
Session认证SessionAuthentication类
使用django默认的session后端进行身份校验,登陆请求验证通过后,django通过session将身份信息保存在服务器中。 -
基本认证BasicAuthentication类
此认证方案使用HTTP 基本认证,针对用户的用户名和密码进行认证。使用这种方式后浏览器会跳出登录框让用户输入用户名和密码认证。基本认证通常只适用于测试。 -
Token认证TokenAuthentication类
该认证方案是DRF提供的使用简单的基于Token的HTTP认证方案。客户端发送登录请求,服务器生成一个Token,并将此Token返回给客户端。以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
DRF认证的使用方式
和权限相差无几,分别可以在settins中配置、在CBV中使用和在FBV中使用等。
- 在settings中设置
REST_FRAMEWORK = {
'DEFAULT_PERMISSON_CLASSES': ('IsOwnerOrReadOnly', ),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
)
}
- 在CBV中使用
class UserAPIView(APIView):
# 逻辑和权限差不多
authentication_classes = (SessionAuthentication)
pass
- 在FBV中使用
@api_view(['GET'])
@authentication_classes((SessionAuthentication, BasicAuthentication))
@permission_classes((IsAuthenticated,))
def example_view(request, format=None):
content = {
'user': unicode(request.user), # `django.contrib.auth.User` 实例。
'auth': unicode(request.auth), # None
}
return Response(content)
自定义认证
编程真有意思,先整一套框架,然后各种自定义玩法。如果自定义权限,自定义认证也是在既定的框架下,按照既定的规则,各种玩法。