📂drf
2022-09-30 20:13阅读: 24评论: 0推荐: 0

drf 多个认证

实现效果:除登录接口无需认证,其他接口如果从params或者头部AUTHORIZATION没有获取到token,则直接认证失败。如果去掉NoAuthentication,则支持匿名访问

认证类

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed


# 参数取值认证
class ParamsAuthentication(BaseAuthentication):
    def authenticate(self, request):
        token = request.query_params.get('token')
        if not token:
            return
        return 'szw', token


# header取值
class HeaderAuthentication(BaseAuthentication):

    def authenticate(self, request):
        token = request.META.get('HTTP_AUTHORIZATION')
        if not token:
            return
        return 'szw', token


# 兜底认证,直接失败
class NoAuthentication(BaseAuthentication):
    def authenticate(self, request):
        raise AuthenticationFailed('认证失败')

settings配置

REST_FRAMEWORK = {
    "UNAUTHENTICATED_USER": None,
    # 认证类
    "DEFAULT_AUTHENTICATION_CLASSES": ['ext.auth.ParamsAuthentication', 'ext.auth.HeaderAuthentication',
                                       'ext.auth.NoAuthentication']
}

视图

# 无需登录
class LoginView(APIView):
    # 优先读取配置项,在读取这里,后读取覆盖先读取
    authentication_classes = []
    def get(self, request):
        print(request.user, request.auth)
        return Response({'status': 'LoginView'})


# 需登录
class OrderView(APIView):
    def get(self, request):
        print(request.user, request.auth)
        return Response({'status': 'OrderView'})


# 需登录
class UserView(APIView):
    def get(self, request):
        return Response({'status': 'UserView'})

本文作者:Sherwin

本文链接:https://www.cnblogs.com/sherwin1995/p/16745997.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Sherwin_szw  阅读(24)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.