您好,登錄后才能下訂單哦!
本篇內容主要講解“Django REST framwork的權限怎么驗證”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Django REST framwork的權限怎么驗證”吧!
在這里插入代碼片# Django REST framwork的權限驗證
一、用戶是否登錄
(1)判斷用戶是否登錄;
permission_classes = (IsAuthenticated, )
注意:permission_classes設置的是:驗證的是用戶是否登錄、用戶是否可以操作該數據等的權限;
權限組合方式,目前支持:與&(and) 或|(or) 非~(not)
例如:permission_classes = (SecAdminPermission | AudAdminPermission,)
注意:使用元組 (SecAdminPermission | AudAdminPermission,)或列表[ SecAdminPermission | AudAdminPermission]都可以。
(2)設置用戶認證方式;
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
注意:authentication_classes設置的是:用戶可以通過哪種方式登錄系統,例如:JWT或傳統的用戶名+密碼方式登錄。
具體代碼如下:
from rest_framework.permissions import IsAuthenticated # 判斷用戶是否登錄 from rest_framework_jwt.authentication import JSONWebTokenAuthentication # jwt用戶認證 class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet): """ list: 獲取用戶收藏列表 retrieve: 判斷某個商品是否已經收藏 create: 收藏商品 delete: 取消收藏 """ # 權限判斷:IsAuthenticated表示是否已經登錄,IsOwnerOrReadOnly表示數據是不是屬于當前登錄用戶 permission_classes = (IsAuthenticated, IsOwnerOrReadOnly) # 用戶認證:方式一:JSONWebTokenAuthentication;方式二:SessionAuthentication authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication) # 定義通過哪個參數來定位實例 lookup_field = "goods_id" # 在詳細頁面時,搜索goods_id來確認該商品有沒有被收藏,是在當前用戶下進行搜索的 def get_queryset(self): """獲取當前登錄用戶的收藏信息""" return UserFav.objects.filter(user=self.request.user) # 方法一:修改商品收藏數 # def perform_create(self, serializer): # """修改商品收藏數""" # instance = serializer.save() # goods = instance.goods # goods.fav_num += 1 # goods.save() # 動態設置序列化類 def get_serializer_class(self): if self.action == "list": return UserFavDetailSerializer elif self.action == "create": return UserFavSerializer return UserFavSerializer
二、用戶是否對該數據有操作權限;
(1)自定義權限驗證
前提:待驗證對象有user字段;
from rest_framework import permissions # 權限判斷:數據是不是屬于當前登錄用戶 class IsOwnerOrReadOnly(permissions.BasePermission): """ Object-level permission to only allow owners of an object to edit it. Assumes the model instance has an `owner` attribute. """ def has_object_permission(self, request, view, obj): # 1 只讀 # Read permissions are allowed to any request, # so we'll always allow GET, HEAD or OPTIONS requests. if request.method in permissions.SAFE_METHODS: # 是不是安全的訪問方法 return True # 2 寫權限 # Instance must have an attribute named `owner`. # return (obj.publisher if obj.publisher else self.fans )== request.user return obj.user== request.user # 判斷當前數據是不是登錄用戶的數據
(2)在接口中,添加數據權限驗證;
class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet): """ list: 獲取用戶收藏列表 retrieve: 判斷某個商品是否已經收藏 create: 收藏商品 delete: 取消收藏 """ # 權限判斷:IsAuthenticated表示是否已經登錄,IsOwnerOrReadOnly表示數據是不是屬于當前登錄用戶 permission_classes = (IsAuthenticated, IsOwnerOrReadOnly) # 用戶認證:方式一:JSONWebTokenAuthentication;方式二:SessionAuthentication authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication) # 設置 lookup_field = "goods_id" # 在詳細頁面時,搜索goods_id來確認該商品有沒有被收藏,是在當前用戶下進行搜索的 def get_queryset(self): """獲取當前登錄用戶的收藏信息""" return UserFav.objects.filter(user=self.request.user)
補充知識:django rest framework api授權與認證
djangorestf 官方文檔 授權與認證教程
permissions.py
from rest_framework import permissions class IsOwnerOrReadOnly(permissions.BasePermission): ''' 常規的授權是 只有擁有者才能編輯它 ''' def has_object_permission(self, request, view, obj): # 讀權限 向所有請求開放 # 所以我們總是允許get, head or options requests. if request.method in permissions.SAFE_METHODS: return True # 寫權限 只給擁有者 return obj.owner == request.user
view.py
'''基于泛型類的視圖''' from snippets.models import Snippet from snippets.serializers import SnippetSerializer, UserSerializer from rest_framework import generics from snippets.permissions import IsOwnerOrReadOnly from django.contrib.auth.models import User class UserList(generics.ListAPIView): ''' User表的列表api視圖 查 增 操作 ''' queryset = User.objects.all() serializer_class = UserSerializer class UserDetail(generics.RetrieveDestroyAPIView): ''' User表的詳情api視圖 查 改 刪操作 ''' queryset = User.objects.all() serializer_class = UserSerializer class SnippetList(generics.ListCreateAPIView): permission_classes = [permissions.IsAuthenticatedOrReadOnly] queryset = Snippet.objects.all() serializer_class = SnippetSerializer def perform_create(self, serializer): serializer.save(owner=self.request.user) class SnippetDetail(generics.RetrieveDestroyAPIView): # detail 所有人都能讀,但是只有擁有者可以更改 # permissions.IsAuthenticatedOrReadOnly 表示沒有認證的人有讀的權限,認證的人有所有權限 # IsOwnerOrReadOnly 通過了前面的授權之后,還要通過這個授權 # 當所有的授權都通過的時候 所有的對象實例都返回true 表示授權通過 permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly] queryset = Snippet.objects.all() serializer_class = SnippetSerializer
總結:通過傳遞permission_classes 類變量 傳遞授權類,
1、請求要進行某個操作的時候 ->
2、傳遞參數將授權類列表中的多個授權類實例化得到實例化對象->
3、調用所有授權實例對象的has_、permission以及has_object_permission方法 ->
4、所有的返回結果都為true ->
5、該操作的授權才通過,數據操作向下繼續進行。
到此,相信大家對“Django REST framwork的權限怎么驗證”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。