CBV-3-csrf_token认证-中间件

Posted yimiflh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CBV-3-csrf_token认证-中间件相关的知识,希望对你有一定的参考价值。

 

 

csrf

views.py

 技术分享图片

1、settings.py没有注释到csrf。当post请求的方式会报错。

技术分享图片

 

技术分享图片

 

如果你不想有csrf_token怎么办?

 

中间件

 

        面试题:
            1. django中间件  最多5个 
                - process_request 请求
                - process_view
                - process_response 相应
                - process_exception 异常
                - process_render_template 
            中间件执行流程:
            process_request 》路由匹配 找到函数不执行。》process_view 》视图函数。》process_response

            2. 使用中间件做过什么?
                - 权限
                - 用户登录验证
                - django的csrf是如何实现?
                    csrf在process_view方法
                        - 检查视图是否被 @csrf_exempt (免除csrf认证)
                        - 去请求体或cookie中获取token

 

中间件执行流程:
技术分享图片

1.FBV:情况一:csrf打开,个别不需要csrf认证。@csrf_exempt  全局使用csrf

 

技术分享图片

 

代码:

                情况一:打开,个别不需要csrf认证。
                    MIDDLEWARE = [
                        django.middleware.security.SecurityMiddleware,
                        django.contrib.sessions.middleware.SessionMiddleware,
                        django.middleware.common.CommonMiddleware,
                        ‘django.middleware.csrf.CsrfViewMiddleware‘, # 全站使用csrf认证
                        django.contrib.auth.middleware.AuthenticationMiddleware,
                        django.contrib.messages.middleware.MessageMiddleware,
                        django.middleware.clickjacking.XFrameOptionsMiddleware,
                    ]
                    
                    
                    from django.views.decorators.csrf import csrf_exempt
                    @csrf_exempt # 该函数无需认证
                    def users(request):
                        user_list = [alex,oldboy]

 

 

2.FBV:情况二:csrf注释,个别需要csrf认证。@csrf_protect  局部使用csrf

 代码:

                情况二:注释,个别需要csrf认证。
                    MIDDLEWARE = [
                        django.middleware.security.SecurityMiddleware,
                        django.contrib.sessions.middleware.SessionMiddleware,
                        django.middleware.common.CommonMiddleware,
                        #‘django.middleware.csrf.CsrfViewMiddleware‘, # 全站不使用csrf认证
                        django.contrib.auth.middleware.AuthenticationMiddleware,
                        django.contrib.messages.middleware.MessageMiddleware,
                        django.middleware.clickjacking.XFrameOptionsMiddleware,
                    ]
                    
                    
                    from django.views.decorators.csrf import csrf_protect
                    @csrf_protect # 该函数需认证
                    def users(request):
                        user_list = [alex,oldboy]
                        return HttpResponse(json.dumps((user_list)))

小结:

情况一:打开,个别不需要csrf认证。 @csrf_exempt # 该函数无需认证  全局使用csrf
情况二:注释,个别需要csrf认证。 @csrf_protect # 该函数需认证  局部使用csrf

 

以上是FBV的csrf的使用,那CBV的csrf如何使用呢?

CBV-csrf的使用

1.CBV:情况一:csrf打开,个别不需要csrf认证。@method_decorator  全局使用csrf

 

技术分享图片

 

运行结果:加在单独发方法上是不行的,还是会报错。

注意:加在单独发方法上是不行的,还是会报错。必须加在dispatch方法上。

 

方式一:加在dispatch方法上。

 

技术分享图片

运行结果:

技术分享图片

方式二:放到类上面。

技术分享图片

 代码:

技术分享图片
            
        CBV小知识,csrf不需要使用时:csrf打开的,全局使用,个别不需要使用。
            - @method_decorator(csrf_exempt)
            - 必须加在dispatch方法中(单独方法无效)
            
            方式一:定义dispatch方法
                from django.views.decorators.csrf import csrf_exempt,csrf_protect
                from django.utils.decorators import method_decorator
                class StudentsView(View):
                    
                    @method_decorator(csrf_exempt)
                    def dispatch(self, request, *args, **kwargs):
                        return super(StudentsView,self).dispatch(request, *args, **kwargs)

                    def get(self,request,*args,**kwargs):
                        print(get方法)
                        return HttpResponse(GET)

                    def post(self, request, *args, **kwargs):
                        return HttpResponse(POST)

                    def put(self, request, *args, **kwargs):
                        return HttpResponse(PUT)

                    def delete(self, request, *args, **kwargs):
                        return HttpResponse(DELETE)
            方式二:加载class类上,指定方法名。装饰的位置不一样。
                from django.views.decorators.csrf import csrf_exempt,csrf_protect
                from django.utils.decorators import method_decorator

                @method_decorator(csrf_exempt,name=dispatch)
                class StudentsView(View):

                    def get(self,request,*args,**kwargs):
                        print(get方法)
                        return HttpResponse(GET)

                    def post(self, request, *args, **kwargs):
                        return HttpResponse(POST)

                    def put(self, request, *args, **kwargs):
                        return HttpResponse(PUT)

                    def delete(self, request, *args, **kwargs):
                        return HttpResponse(DELETE)
csrf打开全局使用,个别需要免除

 

总结:

        总结:
            - 本质,基于反射来实现
            - 流程:路由,view,dispatch(反射)
            - 取消csrf认证(装饰器要加到dispatch方法上且method_decorator装饰)
                
            扩展:
                - csrf 
                    - 基于中间件的process_view方法
                    - 装饰器给单独函数进行设置(认证或无需认证)
                    

 

 


以上是关于CBV-3-csrf_token认证-中间件的主要内容,如果未能解决你的问题,请参考以下文章

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

gin 中间件 权限认证

Django:用户认证组件 & 中间件

如何解决中间件认证错误? [复制]

Laravel 中间件 API 认证

护照认证回调不调用护照中间件