主要用途:用戶登錄了,某個接口可能只有超級管理員才能訪問,普通用戶不能訪問
創(chuàng)新互聯(lián)建站從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目網(wǎng)站設計制作、網(wǎng)站建設網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元普陀做網(wǎng)站,已為上家服務,為普陀各地企業(yè)和個人服務,聯(lián)系電話:13518219792
案列:出版社的所有接口,必須登錄,而且是超級管理員才能訪問
分析步驟
第一步:寫一個類,繼承BasePermission
第二步:重寫has_permission方法
第三步:在方法校驗用戶時候有權限(request.user就是當前登錄用戶)
第四步:如果有權限,返回True,沒有權限,返回FALSE
第五步:self.message 是給前端的提示信息
第六步:局部使用,全局使用,局部禁用
model.py
class User(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
user_type = models.IntegerField(default=3, choices=((1, '超級管理員'), (2, '普通用戶'), (3, '2b用戶')))
def __str__(self):
return self.username
permission.py
from rest_framework.permissions import BasePermission
class UserTypePermission(BasePermission):
def has_permission(self, request, view):
# 只有超級管理員有權限
if request.user.user_type == 1:
return True # 有權限
else:
"""
self.message = '普通用戶和2b用戶都沒有權限'
self.message = '您是:%s 用戶,您沒有權限'%request.user.get_user_type_display()
"""
return False # 沒有權限
"""
self.message = '普通用戶和2b用戶都沒有權限'
返回給前端的提示是什么樣
self.message = '您是:%s 用戶,您沒有權限'%request.user.get_user_type_display()
使用了choice后,user.user_type 拿到的是數(shù)字類型,想變成字符串 user.get_user_type_display()
"""
view.py
# 導入我們所寫的那個權限文件
from .permission import UserTypePermission
# 要驗證必須要登錄,下面的這種方式是局部權限使用
class PublishView(ViewSetMixin, ListCreateAPIView):
# 登錄驗證
authentication_classes = [LoginAuth, ]
# 權限驗證
permission_classes = [UserTypePermission, ]
queryset = Publish.objects.all()
serializer_class = PublishSerializer
class PublishDetailView(ViewSetMixin, RetrieveUpdateDestroyAPIView):
# 登錄驗證
authentication_classes = [LoginAuth, ]
# 權限驗證
permission_classes = [UserTypePermission, ]
queryset = Publish.objects.all()
serializer_class = PublishSerializer
settings.py
全局權限驗證:(要在setting.py文件中配置)
全局驗證需要注意的是在登錄的時候需要添加局部禁用
permission_classes = []
authentication_classes = []
REST_FRAMEWORK = {
# 'DEFAULT_AUTHENTICATION_CLASSES': ['app01.auth.LoginAuth', ]
'DEFAULT_PERMISSION_CLASSES': ['app01.permission.UserTypePermission', ]
}
# 全局的加上以后局部的就可以注釋掉了
內置權限類
注意如果要使用內置的權限類就需要用全套(認證和權限都要用內置的)
# 演示一下內置權限的使用:IsAdminUser,控制是否對網(wǎng)站后臺有權限的人
# 1 創(chuàng)建超級管理員
# 2 寫一個測試視圖類
from rest_framework.permissions import IsAdminUser
from rest_framework.authentication import SessionAuthentication
class TestView3(APIView):
authentication_classes=[SessionAuthentication,]
permission_classes = [IsAdminUser] # 這兩個都要用內置的
def get(self,request,*args,**kwargs):
return Response('這是測試數(shù)據(jù),超級管理員可以看')
# 3 超級用戶登錄到admin,再訪問test3就有權限
# 4 正常的話,普通管理員,沒有權限看(判斷的是is_staff字段)
認證,權限都通過以后,我們可以限制某個接口的訪問頻率,防止有人惡意攻擊網(wǎng)站,一般根據(jù)ip或者用戶限制
案例:無論是否登錄和是否有權限,都要限制訪問的頻率,比如一分鐘訪問3次
分析步驟:
第一步:寫一個類:繼承SimpleRateThrottle
第二步:重寫get_cache_key,返回唯一的字符串,會以這個字符串做頻率限制
第三步:寫一個類屬性scope=‘隨便寫’,必須要跟配置文件對象
第四步:配置文件中寫
'DEFAULT_THROTTLE_RATES': {
'隨意寫': '3/m' # 3/h 3/s 3/d
}
第五步:局部配置,全局配置,局部禁用
throttling.py(SimpleRateThrottle)
from rest_framework.throttling import BaseThrottle, SimpleRateThrottle
# 我們繼承SimpleRateThrottle去寫,而不是繼承BaseThrottle去寫
class TimeThrottling(SimpleRateThrottle):
# 類屬性,這個類屬性可以隨意命名,但要跟配置文件對應
scope = 'throttling'
def get_cache_key(self, request, view):
"""
# 返回什么,頻率就以什么做限制
# 可以通過用戶id限制
# 可以通過ip地址限制
"""
return request.META.get('REMOTE_ADDR') # 這個就是根據(jù)用戶ip進行限制
局部配置
class PublishView(ViewSetMixin, ListCreateAPIView):
authentication_classes = [LoginAuth, ]
# permission_classes = [UserTypePermission, ]
# 局部頻率驗證,每分鐘只能訪問五次
throttle_classes = [TimeThrottling, ]
queryset = Publish.objects.all()
serializer_class = PublishSerializer
class PublishDetailView(ViewSetMixin, RetrieveUpdateDestroyAPIView):
authentication_classes = [LoginAuth, ]
# permission_classes = [UserTypePermission, ]
# 局部頻率驗證,每分鐘只能訪問五次
throttle_classes = [TimeThrottling, ]
queryset = Publish.objects.all()
serializer_class = PublishSerializer
全局配置
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': ['app01.throttling.TimeThrottling', ],
'DEFAULT_THROTTLE_RATES': {
'throttling': '5/m' # 一分鐘訪問5次
}
}
限制未登錄用戶
# 全局使用 限制未登錄用戶1分鐘訪問5次
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
),
'DEFAULT_THROTTLE_RATES': {
'anon': '3/m',
}
}
#views.py
from rest_framework.permissions import IsAdminUser
from rest_framework.authentication import SessionAuthentication,BasicAuthentication
class TestView4(APIView):
authentication_classes=[]
permission_classes = []
def get(self,request,*args,**kwargs):
return Response('我是未登錄用戶')
# 局部使用
from rest_framework.permissions import IsAdminUser
from rest_framework.authentication import SessionAuthentication,BasicAuthentication
from rest_framework.throttling import AnonRateThrottle
class TestView5(APIView):
authentication_classes=[]
permission_classes = []
throttle_classes = [AnonRateThrottle]
def get(self,request,*args,**kwargs):
return Response('我是未登錄用戶,TestView5')
限制登錄用戶的訪問頻次
全局:在setting中
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
),
'DEFAULT_THROTTLE_RATES': {
'user': '10/m',
'anon': '5/m',
}
局部配置:
在視圖類中配一個就行
當前題目:權限類與頻率類
網(wǎng)站地址:http://redsoil1982.com.cn/article16/dsogcdg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站設計公司、App設計、全網(wǎng)營銷推廣、微信公眾號、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)