認證與權限
在完成 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 時一定會用到的,大家要深入理解其中的原理, 才能在使用中融會貫通,得心應手地運用。