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

認證與權限

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

1.認證功能的使用

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

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

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

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

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

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

  • 401 Unauthorized 未認證;

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

2.權限功能的使用

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

我們可以在配置文件中設置默認的權限管理類,一旦配置,全局默認采用配置的認證方案:

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

如果在全局設置文件中沒有配置權限,則采用默認的配置:

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

與認證類似,也可以在視圖中通過 permission_classes 屬性來設置權限類,如

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

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

3. Django Rest framework為我們提供的權限:

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

4. 舉例

設定如下認證類和權限類,用戶只有登錄,才可訪問 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. 自定義權限

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

  • .has_permission(self, request, view)

    是否可以訪問視圖, view表示當前視圖對象

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

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

例如:

class CustomPermission(BasePermission):
    def has_object_permission(self, request, view, obj):
        """控制對obj對象的訪問權限,我們此時返回False,拒絕任何人的請求"""
        return False

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

6. 小結(jié)

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