目 录CONTENT

文章目录

DjangoRestFramework的Api如何鉴权

phyger
2022-06-26 / 0 评论 / 1 点赞 / 644 阅读 / 2,158 字 / 正在检测是否收录...

1、前言

上篇文章,我们初步认识了DjangoRestFramework的安装和使用,已经具备快速开发Restful风格的接口了。但是在实际的生产过程中,我们通常需要根据业务需求对不同的接口进行权限的校验。

今天我们就来入门DjangoRestFramework的接口鉴权。

2、快速开始

2.1、在视图中使用permission_classes控制

第一种方式,我们可以直接在视图类(函数)中指定permission_classes对当前接口进行访问控制。

常用的控制类型:

  1. IsAuthenticated
  2. IsAdminUser
  3. IsAuthenticatedOrReadOnly

我们这里使用IsAuthenticated作为演示,这个权限标识经过认证的用户都有权限访问。

app0/views.py

...
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import APIView
​
class MyView(APIView):
    permission_classes = [permissions.IsAuthenticated]
    def get(self, request, *args, **kwargs):
        print(request)
        return Response("Get information successfully!")

如上,需要鉴权的视图类(函数)继承了APIView,类似上节的PersonViewSet集成了ModelViewSet一样,我们使用DjangoRestFramework都是集成了它已有的功能;我们在视图类中指定了permission_classes=IsAuthenticated,代表当前接口需要经过认证才能访问。

dj0/urls.py

增加rest_framework的认证路由

from django.contrib import admin
from django.urls import path,include
from app0 import views
​
urlpatterns = [
    path('admin/', admin.site.urls),
    path('app0/', include('app0.urls')),
    path('',views.hi),
    path('api-auth/', include('rest_framework.urls'))  # add
    ]

app0/urls.py

增加app0/info/接口的路由

from django.urls import path
​
from . import views
from rest_framework.routers import DefaultRouter
​
router = DefaultRouter()  # 可以处理视图的路由器
router.register('person', views.PersonViewSet)  # 向路由器中注册视图集
​
app_name='app0'
urlpatterns = [
    path('', views.v1,name='app0index'),
    path('hi', views.hi,name='hi'),
    path('info/', views.MyView.as_view()), ## add
]
urlpatterns += router.urls

默认的DjangoRestFramework是使用了DjangoAdmin的用户权限的。

我们直接访问(未登录):http://localhost:8989/app0/info/

未认证状态

我们点击右上角login使用admin用户登录后:

认证后状态

我们可以清楚的看到,认证后已经可以拿到接口的正常响应了。

以上,我们仅对app0/info/接口进行的权限控制,其他接口都是放开的。

访问:http://localhost:8989/app0/person/

开放的接口

从右上角的login我们可以确定这个接口是不用登陆也能访问的,即开放的。

2.2、全局配置

当我们想要对全局的接口都进行认证控制时,我们对每个接口都进行配置,显然不够合理。此时我们只需要对应用进行全局配置即可。

接口中的permission_classes就不需要了。

dj0/settings.py

STATIC_URL = '/static/'
# 以下为新增
REST_FRAMEWORK = {
 'DEFAULT_PERMISSION_CLASSES': (
  'rest_framework.permissions.IsAuthenticated',
 )
}

以上配置就可以实现全局的接口访问控制,即所有接口都需要认证后才能进行访问。

再次访问:http://localhost:8989/app0/person/

开启全局认证后

登录后再次访问:http://localhost:8989/app0/person/

全局认证成功后

3、最后

以上就是使用DjangoRestFramework进行接口权限校验的入门知识,如果你想快速的开发出一个具备CRUD和权限认证功能的后端服务,那么DjangoRestFramework将会是你不二的选择。

1

评论区