4:Django-DRF-认证
认证
rest_framework给我们提供了认证的接口,由BaseAuthentication类提供接口,也有一些封装好的认证类(请走入源码....)
接口函数 authticate 认证成功返回一元组(user,token)分别赋值给request.user 和 request.token
认证规则:
认证组件:校验用户 - 游客、合法用户、非法用户
游客:代表校验通过,直接进入下一步校验(权限校验)
合法用户:代表校验通过,将用户存储在request.user中,再进入下一步校验(权限校验)
非法用户:代表校验失败,抛出异常,返回403权限异常结果
只要通过认证不管是游客还是登录用户,request.user都有值
Django RESTFUL提供的认证一共有4种
我们只介绍三种,第四种RemoteUserAuthentication几乎不用,当然我们首先先来介绍这几种,看看他们有啥区别:
- BasicAuthentication:此身份验证方案使用HTTP基本身份验证,根据用户的用户名和密码进行签名。基本身份验证通常仅适用于测试。
- TokenAuthentication: 此身份验证方案使用基于令牌的简单HTTP身份验证方案。令牌认证适用于客户端 - 服务器设置,例如本机桌面和移动客户端。
- SessionAuthentication: 此身份验证方案使用Django的默认会话后端进行身份验证。会话身份验证适用于与您的网站在同一会话上下文中运行的AJAX客户端。
- RemoteUserAuthentication(不经常用,忘记):此身份验证方案允许您将身份验证委派给Web服务器,该服务器设置
REMOTE_USER
环境变量。
说明:
- BasicAuthentication:客户端用户名密码认证
- TokenAuthentication:采用token值进行校验
- SessionAuthentication:采用sessionid的方式进行校验。
下面是一个简单的认证示例
class Auth(BaseAuthentication):
"""
继承于BaseAuthentication认证类
"""
def authenticate(self, request):
# print(request.method)
if request.method in ["POST","PUT","DELETE"]:
# 如果请求是post,put,delete三种类型时
# 获取随用户请求发来的token随机码
token = request.data.get("token")
# 然后去数据库查询有没有这个token
token_obj = models.Token.objects.filter(token=token).first()
if token_obj:
# 如果存在,则说明验证通过,以元组形式返回用户对象和token
return token_obj.user,token
else:
# 不存在就直接抛错
raise AuthenticationFailed("无效的token")
else:
# 这一步的else 是为了当用户是get请求时也可获取数据,并不需要验证token.
return None,None
def authenticate_header(self, request):
pass
class OrderView(APIView):
#局部认证
authentication_classes = [Auth]
def get(self,request):
return HttpResponse('用户信息')
我们的认证类可以放在局部视图函数,也可以配置为全局认证。
局部视图函数认证:
class MyView(APIView):
# 只需要在视图里单独加上认证类即可
authentication_classes = [Auth]
pass
全局配置 在settings.py 的路径
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ['app.utils.Authuser.Auth'],
"UNAUTHENTICATED_USER":lambda :"匿名用户",
"UNAUTHENTICATED_USER":None, # 匿名,request.user = None
"UNAUTHENTICATED_TOKEN":None,# 匿名,request.auth = None
}
豁免认证
class OrderView(APIView):
#豁免认证
# 当前视图不使用认证
authentication_classes = []
def get(self,request):
return HttpResponse('用户信息')
认证返回值
# raise Exception(), 不在继续往下执行,直接返回给用户。
# return None ,本次认证完成,执行下一个认证
# return ('x',"x"),认证成功,不需要再继续执行其他认证了,继续往后权限、节流、视图函数