- auth是用來做用戶驗(yàn)證
- permission是用來做權(quán)限認(rèn)證
判斷用戶是否登陸:
user_operation/view.py:
from rest_framework.permissions import IsAuthenticated
permission_classes = (IsAuthenticated,)
用戶未登錄訪問userfav的list會(huì)給我們拋出401的錯(cuò)誤。
在utils中新建permissions,這是我們自定義的permissions。
utils/permissions.py:
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):
# 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
# Instance must have an attribute named `owner`.
return obj.user == request.user
這個(gè)自定義的permission類繼承了我們的BasePermission。它有一個(gè)方法叫做has_object_permission,是否有對象權(quán)限。檢測我們從數(shù)據(jù)庫中拿出來的obj的user是否等于request.user。安全的方法也就是不會(huì)對數(shù)據(jù)庫進(jìn)行變動(dòng)的方法,總是可以讓大家都有權(quán)限訪問到。
views中添加該自定義的權(quán)限認(rèn)證類
user_operation/views.py:
from utils.permissions import IsOwnerOrReadOnly
permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
這樣在做刪除的時(shí)候就會(huì)驗(yàn)證權(quán)限。
不能讓所有的收藏關(guān)系數(shù)據(jù)都被獲取到。因此我們要重載get_queryset方法
def get_queryset(self):
return UserFav.objects.filter(user=self.request.user)
重載之后queryset的參數(shù)配置就可以注釋掉了。
token的認(rèn)證最好是配置到view里面去,而不是配置到全局中。
前端的每一個(gè)request請求都加入我們的token的話,token過期了,當(dāng)用戶訪問goods列表頁等不需要token認(rèn)證的頁面也會(huì)拿不到數(shù)據(jù)。
將setting中的'rest_framework.authentication.SessionAuthentication'刪除掉。
然后在具體的view中來import以及進(jìn)行配置
user_operation/views.py中實(shí)現(xiàn)代碼:
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
authentication_classes = (JSONWebTokenAuthentication, )
此時(shí)在我們在后臺(tái)無法使用session登陸查看userfav,是因?yàn)槲覀兊念悆?nèi)auth并不包含session auth,添加session登陸:
from rest_framework.authentication import SessionAuthentication
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)