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的基本方式
    ),

}

三种权限的认证顺序:

认证流程中若请求头中带自定义请求头: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认证);

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

具体步骤:

改写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验证下:

没有带自定义请求头,

相当于没带自动以请求头

错误的jwt token值

正确的jwt token值

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

完!

点这里可以跳转到人工智能网站

发表评论