6-3 认证和权限-DRF认证之BasicAuthentication认证

目录:

  • Django RESTFUL提供的认证介绍
  • 初始化操作
  • BasicAuthentication 用户名密码认证

一、Django RESTFUL提供的认证介绍

Django RESTFUL提供的认证一共有4种,我们只介绍三种,第四种RemoteUserAuthentication几乎不用,当然我们首先先来介绍这几种,看看他们有啥区别:

  • BasicAuthentication:此身份验证方案使用HTTP基本身份验证,根据用户的用户名和密码进行签名。基本身份验证通常仅适用于测试。
  • TokenAuthentication: 此身份验证方案使用基于令牌的简单HTTP身份验证方案。令牌认证适用于客户端 - 服务器设置,例如本机桌面和移动客户端。
  • SessionAuthentication: 此身份验证方案使用Django的默认会话后端进行身份验证。会话身份验证适用于与您的网站在同一会话上下文中运行的AJAX客户端。
  • RemoteUserAuthentication(不经常用,忘记):此身份验证方案允许您将身份验证委派给Web服务器,该服务器设置REMOTE_USER 环境变量。

说明:

  • BasicAuthentication:客户端用户名密码认证
  • TokenAuthentication:采用token值进行校验
  • SessionAuthentication:采用sessionid的方式进行校验。

二、初始化操作

之前我们也说了, DRF的 APIView视图其实是自带了验证,可以参考:6-1 认证和权限-DRF认证 。所以我们得知,APIView默认给我们的提供的 认证:

DEFAULTS = {
    ...,
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication', #取决哪种方式,是看谁认证成功了,就用谁的
        'rest_framework.authentication.BasicAuthentication'
    ),
    .....
}

1、重新初始化app05

>python manage.py startapp app05

#在setting.py中install app中添加 app05

2.、视图

说明:编辑视图views.py函数

from rest_framework.views import APIView
from django.http import JsonResponse

# Create your views here.


class CartView(APIView):

    def get(self, request, *args, **kwargs):

        ctx = {
            "code": 1,
            "msg": "ok",
            "data": {
                "goods": [
                    {
                        "name": "苹果",
                        "price": 12
                    }
                ]
            }
        }

        return JsonResponse(ctx)

我们为什么要用APIView呐?因为APIView最大限度的扩展我们自己想要的功能,因为如果我们用他们封装好的功能,封装的越抽象,你的扩展行越差。

3、路由设置

说明:设置根级路由和子路由

#设置根级路由
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('app05.urls'))
]

#设置子路由
from django.urls import path
from app05 import views


urlpatterns = [
    path("cart/", views.CartView.as_view(), name="cart-list"),
]

三、BasicAuthentication 用户名密码认证

3.1、思路

  首先  你先登录 只有登录的情况下才能访问  ->  权限控制 permission 告诉用户 你是否登录 (IsAuthenticated) ->  好,登录的问你 需要用什么方式认证 authentication_classes -> 这边就选择认证方式[BasicAuthentication]

3.2、视图编辑

说明:permission_classes问你,你登录了吗?我:登录了(IsAuthenticated)。那你什么方式认证(authentication_classes)的呐? 我用BasicAuthentication基于用户名密码方式认证的。注意:还有强调的是这样写认证是局部的,只针对这个视图有效。

from rest_framework.views import APIView
from django.http import JsonResponse
from rest_framework.authentication import BasicAuthentication
from rest_framework.permissions import IsAuthenticated

# Create your views here.


class CartView(APIView):
    # 基于什么登录认证的(通过什么方式登录)
    authentication_classes = [BasicAuthentication] #对APIView的authentication_classes重写

    # 只有登录才能访问(权限控制你是否登录)
    permission_classes = [IsAuthenticated]  #查看IsAuthenticated源码 => Ctrl + IsAuthenticated
    def get(self, request, *args, **kwargs):

        ctx = {
            "code": 1,
            "msg": "ok",
            "data": {
                "goods": [
                    {
                        "name": "苹果",
                        "price": 12
                    }
                ]
            }
        }

        return JsonResponse(ctx)

测试结果:

 

 Http Basic 是一种比较简单的身份认证方式。 在 Http header 中添加键值对 Authorization: Basic xxx (xxx 是 username:passowrd base64 值)。而Base64 的解码是非常方便的,如果不使用 Https ,相当于是帐号密码直接暴露在请求中。

GET /auth/basic/ HTTP/1.1
Host: xxxxx
Authorization: Basic em1rOjEyMzQ1Ng==
posted @ 2020-04-29 11:17  帅丶高高  阅读(1077)  评论(0)    收藏  举报