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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值