zoukankan      html  css  js  c++  java
  • rest_framework之认证详解 01

    如果我们写API有人能访问,有人不能访问,则需要些认证。 如何知道该用户是否已登入?

    如果用户登入成功,则给用户一个随机字符串,去访问另一个页面。  

    以前写session的时候,都是把session写cookie里面。  

    那现在我们可以把随机字符串通过返回值的方式给用户。  

    后端通过查看用户的url判断用户有没有token值且这个字符串是否正确也要判断。有则已登入,可以访问;没有则跳回登入页面。  

    用户登入

    1.有些api需要用户登入才能访问,有些api不需要用户登入就能访问。

    models.py

    创建用户

    urls.py

    views.py    用户登入只有post请求

    token用md5加密,并保存或更新到数据库中。

     post请求,运行结果

     

     token就保存到数据库了   需要重新检查代码

     token生成成功后,就将新的token返回给用户。有异常则返回异常。API写完了。

     

     运行结果

     认证

    用户所有订单app01

    1.订单url

    2. views.py订单视图

     

     3.运行结果:get请求

     

     4.这个订单只有登入成功的时候才可以看

     

     运行结果

     rest_framework认证

    5.这段代码假设post请求也要认证,如果再复制一遍就会很冗余。django已经帮我们封装好了,不用自己写。

     6.自定义一个认证类,自己写认证规则。

    7.认证源码

    8.自己定义认证规则,认证失败则返回一个异常。

     9.注意:必须再写一个方法,否则还会报错。  

    引入该模块, 加上该方法:先为空。

    查看该模块源码

     加上该方法:先为空。

    运行结果

     用户信息app

    1.假设用户信息app也要认证,(登入后才能访问) 

    自定义的一个认证写完了之后,app视图加上就好了。

     2.如果有成千上万个api都需要认证怎么办呢  

    接下来全局认证:不需要每一个视图都自己加上以上代码,全局配置settings.py。      

    认证源码流程图:

    APIView类
    第一步class OrderView(APIView):点击APIView
    第二步def dispatch(self, request, *args, **kwargs):
    找到self.initial(request, *args, **kwargs),点击initial
    第三步def initial(self, request, *args, **kwargs):
    找到self.perform_authentication(request)(进行认证)
    点击perform_authentication
    第四步def perform_authentication(self, request):
    request.user
    
    Request类
    第五步同上def dispatch(self, request, *args, **kwargs):
    找到request = self.initialize_request(request, *args, **kwargs)
    点击initialize_request
    第六步def initialize_request(self, request, *args, **kwargs):
    找到return Request,点击Request
    第七步class Request(object):
    找到    @property    def user(self):(获取认证对象,进行一步步认证)
    找到return self._user   
    第八步还是@property    def user(self):里面
    找到self._authenticate()点击_authenticate
    第九步def _authenticate(self): (循环所有对象,执行认证方法)
    
    Authtication自定义认证类(自己写了认证方法,就用自己的)
    第十步def authenticate(self, request):
    报错:(返回元祖(user对象,token对象))
    
    class OrderView(APIView):或class AuthView(APIView):等订单
    第十一步执行各个订单的def post:  或def get:等方法

     源码配置

     1.dispatch

     2.封装Request

    3.for循环认证列表

    4.默认去全局的配置文件读

    5.如果自己请求函数里面设置了,就用自己的。没设置就用配置文件的。

    6.将认证写在配置文件中,不用局部的。

     源码:  api_settings表示去配置文件中读。

    读REST_FRAMEWORK这个key

    7.setting.py

    8.将认证相关的东西都写在一个文件中。再引入该文件

    settings.py

    views.py:视图文件中只有视图相关的类。

    9.列表里填你自己写的认证类的路径。   view.py里的所有类都不用加了,默认用session全局的认证。

    10.登入不需要认证信息。全局认证,个别不需要认证。  空列表就行

     11.运行结果:

     订单接口:

    登入接口:

    订单接口:

     接下来是匿名用户登陆问题

     Request封装直接到:

    1.读取全局认证配置

    2.进行认证

    3.initial > 实现认证self.perform_authentication(request)

    4.user

    5.获取认证对象,进行下一步步的认证

    往下走

    6.如果是匿名用户,默认叫什么

    setting.py

     views.py

    urls.py

    运行结果

     7.源码设置默认用户名:

     8.设置匿名用户名

    "UNAUTHENTICATED_USER":lambda :"匿名用户"   若匿名函数没有参数,直接返回字符串

    url请求

    运行结果:

    9.setting.py:

    内置认证

    1.django内置的认证  引入BaseAuthentication

    BaseAuthentication源码:

    2.BaseAuthentication 下有两个方法。

    3.推荐继承BaseAuthentication。更规范。

    接下来继续走源码:  BasicAuthentication  基于浏览器认证

    1.往下走,复制源码

    settings.py

     运行结果

    3.views.py: 引入BasicAuthentication

    4.运行结果

    5.看源码

    6.改源码,先注释一下2行代码

     不注释表示允许用户为匿名用户。

    7.运行结果:浏览器会对用户名和密码加密放到url上,然后发给服务端,进行验证。

    8.还原代码

    本章结束

  • 相关阅读:
    2020年软件工程作业04
    2020年软件工程作业03
    2020年软件工程作业02
    2020年软件工程作业01
    计算机与软件工程 作业六
    计算机与软件工程 作业四
    计算机与软件工程 作业三
    计算机与软件工程 作业二
    计算机与软件工程作业一
    《402团队》:团队项目选题报告
  • 原文地址:https://www.cnblogs.com/aaronthon/p/9218371.html
Copyright © 2011-2022 走看看