認(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)用。