实现一个视图类可以被认证用户访问,也可以为未认证用户访问,但是访问的内容不一样
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值
后续,可在相应的返回前做相应的处理。
完!
版权声明:本文为p571912102原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。