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==

浙公网安备 33010602011771号