Django REST framework JWT认证方式和BasicAuthentication认证方式实现认证用户与未认证用户访问同一视图类并得到不同的功能

实现一个视图类可以被认证用户访问,也可以为未认证用户访问,但是访问的内容不一样

Django REST framework 三种认证方式:

REST_FRAMEWORK = {
    # 异常处理
    'EXCEPTION_HANDLER': 'meiduo_mall.utils.exceptions.exception_handler',

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication', #第一种jwt方式
        'rest_framework.authentication.SessionAuthentication', #第二种session方式
        'rest_framework.authentication.BasicAuthentication', #第三种Django的基本方式
    ),

}

三种权限的认证顺序:

 

Django REST framework JWT认证方式和BasicAuthentication认证方式实现认证用户与未认证用户访问同一视图类并得到不同的功能_第1张图片

认证流程中若请求头中带自定义请求头:Authorization:JWT *********** 就会进入jwt的认证方式,若认证错误会报错返回前端(报错内容:Invalid Authorization header. Credentials string should not contain spaces.)。

Authorization:JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIbzI1NiJ9.eyJ1b2VyX2lkIjo3LCJleHAiOjE1MzIwNzc0MTgsInVzZXJuYW1lIjoicHl0aG9uIiwiZW1haWwiOiI1Nzb4OTEyMTAyIn0.RPo0tlz8v5Tqak9rXlWiIBoDTvEx_XClTwblWHmhU6g

若请求头不带Authorization:JWT *********** (红色字体部分必须一致,不一致相当于没带。)会判断是否带session_id 若不带session_id 进入base认证(这次我选择的是jwt认证和base认证)。base认证通过user为认证过的用户,base认证不通过user为匿名用户AnonymousUser(base认证应该是rest直接调用了Django的base认证);

需要实现的逻辑:(程序中只需判断其是否为实名,其余的都为匿名)

Django REST framework JWT认证方式和BasicAuthentication认证方式实现认证用户与未认证用户访问同一视图类并得到不同的功能_第2张图片

具体步骤:

改写JWT认证流程:

class CatAPIView(APIView):
    #重写APIView父类的方法perfrom_authentication ,原方法中只调用request.user 获取user 实现认证,pass 掉后 会在视图中第一次获取user时进行认证。
    def perform_authentication(self, request):
        # request.user
        pass

视图中实现逻辑:

class CatAPIView(APIView):
    # permission_classes = [IsAuthenticated]

    def perform_authentication(self, request):
        pass


    def post(self,request):
        try:
            user = request.user
        except Exception as e:
            user = None
            print(e)
        print('用户:',user)
        # if isinstance(user,AnonymousUser):
        if user is None:
            return Response(user,":jwt有误,验证不通过--->匿名用户")
        elif user is not None and user.is_authenticated:
            return Response(user,':通过认证,并且实名认证')    #当为提供请求头中未提供jwt 就不经过jwt认证,进入django的session认证 ,session认证 is_authenticated: 通过认证 user为用户名   不通过 user为 AnonymousUser(匿名用户)
            
        else:
            return Response(user,'没有带jwt请求头----->匿名用户')

 

    类属性:permission_classes = [IsAuthenticated]  表示 访问该视图必须经过jwt认证(此时未经过认证和认证失败的就不能访问了,我们这里不需要这行代码)

class CatAPIView(APIView):
    # permission_classes = [IsAuthenticated]
    
    def post(self,request)
        ...

postman验证下:

没有带自定义请求头,

Django REST framework JWT认证方式和BasicAuthentication认证方式实现认证用户与未认证用户访问同一视图类并得到不同的功能_第3张图片

相当于没带自动以请求头

Django REST framework JWT认证方式和BasicAuthentication认证方式实现认证用户与未认证用户访问同一视图类并得到不同的功能_第4张图片

 

错误的jwt token值

Django REST framework JWT认证方式和BasicAuthentication认证方式实现认证用户与未认证用户访问同一视图类并得到不同的功能_第5张图片

正确的jwt token值

Django REST framework JWT认证方式和BasicAuthentication认证方式实现认证用户与未认证用户访问同一视图类并得到不同的功能_第6张图片

 

后续,可在相应的返回前做相应的处理。

完!

你可能感兴趣的:(Django)