第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

認(rèn)證與權(quán)限

在完成 RESTful Web API 搭建之后,似乎主要工作已經(jīng)完成。大家仔細(xì)想想,還有沒遺漏什么?對(duì)了,現(xiàn)在的接口任何人都可以訪問,試想,一個(gè)任何人都能夠訪問的師生管理系統(tǒng),如果被別有用心的人利用,豈不是會(huì)造成一定的隱患?再看周圍的一些系統(tǒng),是不是大多都需要登陸后才能使用,而另外一些系統(tǒng),不同的用戶登陸,操作權(quán)限又不同,那這些又是如何實(shí)現(xiàn)的呢。這一小節(jié),我們就來介紹在 Django REST framework 中如何實(shí)現(xiàn) RESTful Web API 的認(rèn)證和權(quán)限分配。

1.認(rèn)證功能的使用

通常,我們可以在設(shè)置文件中配置全局默認(rèn)的認(rèn)證方案,一旦配置,全局默認(rèn)采用配置的認(rèn)證方案

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',   # 基本認(rèn)證
        'rest_framework.authentication.SessionAuthentication',  # session認(rèn)證
    )
}

另外,我們也可以為不同的視圖分別指定不同的認(rèn)證方案,此時(shí)可在視圖中通過 authentication_classes指定:

from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.views import APIView

class ExampleView(APIView):
    authentication_classes = (SessionAuthentication, BasicAuthentication)
    ...

認(rèn)證成功,即可獲取接口內(nèi)容,而認(rèn)證失敗,通常會(huì)有兩種可能的返回值:

  • 401 Unauthorized 未認(rèn)證;

  • 403 Permission Denied 權(quán)限被禁止(配合權(quán)限使用)。

2.權(quán)限功能的使用

權(quán)限控制可以限制用戶對(duì)于視圖的訪問和對(duì)于具體數(shù)據(jù)對(duì)象的訪問。

我們可以在配置文件中設(shè)置默認(rèn)的權(quán)限管理類,一旦配置,全局默認(rèn)采用配置的認(rèn)證方案:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

如果在全局設(shè)置文件中沒有配置權(quán)限,則采用默認(rèn)的配置:

'DEFAULT_PERMISSION_CLASSES': (
   'rest_framework.permissions.AllowAny',
)

與認(rèn)證類似,也可以在視圖中通過 permission_classes 屬性來設(shè)置權(quán)限類,如

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)
    ...

3. Django Rest framework為我們提供的權(quán)限:

  • AllowAny:允許所有用戶;
  • IsAuthenticated:僅通過認(rèn)證的用戶;
  • IsAdminUser:僅管理員用戶;
  • IsAuthenticatedOrReadOnly:認(rèn)證的用戶可以完全操作(增刪改查),否則只能讀?。ú椋?。

4. 舉例

設(shè)定如下認(rèn)證類和權(quán)限類,用戶只有登錄,才可訪問 StudentDetailVie 視圖提供的接口:

from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import RetrieveAPIView
from AppDemo.models import StudentsModel
from AppDemo.serializers import StudentsSerializer

class StudentDetailView(RetrieveAPIView):
    queryset = StudentsModel.objects.all()
    serializer_class = StudentsSerializer
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticated]

5. 自定義權(quán)限

有時(shí),Django Rest framework 為我們提供的權(quán)限無法滿足實(shí)際需求,我們需要自定義權(quán)限,此時(shí)只需繼承 rest_framework.permissions.BasePermission,并重寫以下兩個(gè)方法:

  • .has_permission(self, request, view)

    是否可以訪問視圖, view表示當(dāng)前視圖對(duì)象

  • .has_object_permission(self, request, view, obj)

    是否可以訪問數(shù)據(jù)對(duì)象, view表示當(dāng)前視圖, obj為數(shù)據(jù)對(duì)象

例如:

class CustomPermission(BasePermission):
    def has_object_permission(self, request, view, obj):
        """控制對(duì)obj對(duì)象的訪問權(quán)限,我們此時(shí)返回False,拒絕任何人的請(qǐng)求"""
        return False

class StudentViewSet(ModelViewSet):
    queryset = StudentsModel.objects.all()
    serializer_class = StudentsSerializer
    permission_classes = [IsAuthenticated, MyPermission]

6. 小結(jié)

數(shù)據(jù)安全是系統(tǒng)的核心要求,因而只有通過認(rèn)證的用戶才能獲取關(guān)鍵數(shù)據(jù),另外,不同類型數(shù)據(jù)的敏感程度不同,因而要為不同的認(rèn)證用戶劃分可以訪問的數(shù)據(jù)。本節(jié)向大家介紹的認(rèn)證和權(quán)限,幾乎是構(gòu)建 API 時(shí)一定會(huì)用到的,大家要深入理解其中的原理, 才能在使用中融會(huì)貫通,得心應(yīng)手地運(yùn)用。