41.SessionAuthenticatio和自定义认证
SessionAuthentication认证介绍
- SessionAuthentication使用了Django默认的会话后端
- 适合AJAX客户端等运行在同样会话上下文环境中的模式
- 是DRF默认的认证方式之一
SessionAuthentication认证属性
#认证成功 SessionAuthentication 提供下面的属性
request.user :设置为一个Django的 User 类的实例
request.auth :设置为None
# 认证不成功将返回 HTTP 403 Forbidden 响应,没有额外的头部信息
'''
如果使用类似AJAX风格的API,并采用SessionAuthentication认证
当使用不安全的HTTP方法,比如 PUT , PATCH , POST 或者 DELETE,必须提供合法的CSRF令牌
DRF框架中的CSRF验证与标准Django的CSRF验证的工作方式略有不同
因为需要同时支持同一视图的会话和非会话身份验证
只有经过身份验证的请求才需要CSRF令牌,匿名请求可以在没有CSRF令牌的情况下发送
不适用于登录视图,登录视图应始终应用CSRF验证
'''
RemoteUserAuthentication认证
'''
使用Django的auth框架的认证功能
必须在AUTHENTICATION_BACKENDS 配置中使用django.contrib.auth.backends.RemoteUserBackend (或者继承它)
如果认证成功, RemoteUserAuthentication 提供下面的属性:
request.user :设置为一个Django的 User 类的实例
request.auth :设置为None
此认证一般使用不多
'''
自定义认证
# 导入用户模型
from django.contrib.auth.models import User
# 导入认证模块
from rest_framework import authentication
# 异常模块
from rest_framework import exceptions
# 继承BaseAuthentication,实现BaseAuthentication两个待实现的方法
class UserAuthentication(authentication.BaseAuthentication):
# 认证模块,返回None 或者user
def authenticate(self, request):
'''
从头部获取用户信息
头部自定义字段为MyUsername
Django会自动拼上HTTP_全大写英文
'''
username = request.MEATA.get('HTTP_MYUSERNAME')
# 没有用户信息返回None
if not username:
return None
try:
# 去User查找对应用户信息
user = User.objects.get(username=username)
except User.DoesNotExist:
# 如果找不到对应用户 抛出异常
raise exceptions.AuthenticationFailed('没有对应用户')
# 找对对应用户 返回
return (user, None) # (request.user,request.auth)
风月都好看,人间也浪漫.