我们创建一个文件夹authentications,写入如下代码
from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import AuthenticationFailed from api.models import User class MyAuthentications(BaseAuthentication): def authenticate(self, request): # 前台在请求头携带认证信息 # 且默认规范用Authorization字段携带认证信息 # 后台固定在请求对象的META字段中的HTTP_AUTHORIZATION获取 auth = request.META.get('HTTP_AUTHORIZATION', None) # 处理游客 if auth is None: return None auth_list = auth.split() if not len(auth_list) == 2 and auth_list[0].lower() == "auth": raise AuthenticationFailed("认证信息有误,非法用户") # 合法的用户还需要从auth_list[1]中解析出来 # 注:假设一种情况,信息为xx.yy.zz,就可以解析出admin用户:实际开发,该逻辑一定是校验用户的正常逻辑 if auth_list[1] != 'xx.yy.zz': # 校验失败 raise AuthenticationFailed("用户校验失败,非法用户") user = User.objects.filter(username='jkc').first() print(user) if not user: raise AuthenticationFailed("用户数据有误,非法用户") return user, None然后在settings.py中配置全局的自定义认证类
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'api.authentications.MyAuthentications' ], }最后写入视图函数
class TestView(APIView): def get(self, request, *args, **kwargs): return APIResponse(data_msg="drf get ok")然后我们访问视图,在headers中不传Authorization 代表游客,游客可以访问成功
{ "statusCode": 0, "message": "drf get ok" }接着我们在请求头中只传auth
访问视图会抛出异常信息 { "detail": "认证信息有误,非法用户" }
然后我们在请求头中传入错误的认证,auth 111
访问视图会抛出异常信息 { "detail": "用户校验失败,非法用户" }
最后我们在请求头中传入正确的认证,auth xx.yy.zz,这次会得到正确的返回结果
{ "statusCode": 0, "message": "drf get ok" }以上的测试,就代表我们自定义的认证类起作用了