Loading

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)
 

posted @ 2022-10-09 18:56  木子七  阅读(44)  评论(0编辑  收藏  举报