Django REST framework JWT认证方式和BasicAuthentication认证方式实现认证用户与未认证用户访问同一视图类并得到不同的功能
2018-07-19 20:36
911 查看
实现一个视图类可以被认证用户访问,也可以为未认证用户访问,但是访问的内容不一样
Django REST framework 三种认证方式:
[code]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.)。
[code]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认证流程:
[code]class CatAPIView(APIView): #重写APIView父类的方法perfrom_authentication ,原方法中只调用request.user 获取user 实现认证,pass 掉后 会在视图中第一次获取user时进行认证。 def perform_authentication(self, request): # request.user pass
视图中实现逻辑:
[code]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认证(此时未经过认证和认证失败的就不能访问了,我们这里不需要这行代码)
[code]class CatAPIView(APIView): # permission_classes = [IsAuthenticated] def post(self,request) ...
postman验证下:
没有带自定义请求头,
相当于没带自动以请求头
错误的jwt token值
正确的jwt token值
后续,可在相应的返回前做相应的处理。
完!
阅读更多相关文章推荐
- 利用Django内置的认证视图实现用户密码重置功能详解
- AngularJS中实现用户访问的身份认证和表单验证功能
- django Rest Framework----认证/访问权限控制/访问频率限制 执行流程 Authentication/Permissions/Throttling 源码分析
- AngularJS中实现用户访问的身份认证和表单验证功能
- Django 权限认证 编写 -- 根据不同的用户,设置不同的显示和访问权限
- 在.NET下如何用WebService实现身份认证,及如何跟踪用户的访问,如类似Possport的功能,不会还是用Session吧?
- Laravel 5.3 使用内置的 Auth 组件实现多用户认证功能以及登陆才能访问后台的功能的一种实现方法
- Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(json web token) 用户发送按照约定,向服务端发送 Header、Payload 和 Signature,
- powerdns与nginx结合实现以域名和IP方式访问web服务器80端口时分别跳转到不同页面
- vsftp虚拟不同用户配置不同目录访问实现
- Laravel实现多用户认证功能实现详解
- laravel 使用JWT实现用户认证
- Django - 前后端分离之JWT用户认证
- 获取系统URL访问的前三名(通过Scala方式实现/通过Spark方式实现),Spark将URL访问日志进行分类并通过自定义Partitioner的方式将文件写入到不同分区上
- 详解Django rest_framework实现RESTful API
- Oracle DB Link实现两台机器上不同Oracle数据库用户间访问
- RuntimeError at /jwt-auth django rest_framework
- nginx实现用户认证访问页面
- 启动Nginx目录浏览功能及 让用户通过用户名密码认证访问web站点
- API接口JWT方式的Token认证(上),服务器(Laravel)的实现