Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)
閱讀目錄
-
一、認(rèn)證組件
使用方法:
token簡(jiǎn)單描述:
應(yīng)用token編寫登錄接口: -
二、權(quán)限組件
使用方法:
-
三、頻率組件
使用方法:
一、認(rèn)證組件
回到頂部
使用方法:
①寫一個(gè)認(rèn)證類,新建文件:my_examine.py
局部使用:在視圖類中添加認(rèn)證:
from app01.my_examine import MyAuth # Create your views here.class Books(APIView):# 給Books視圖類添加token認(rèn)證authentication_classes = [MyAuth, ]def get(self, request):response = {'code': 100, 'msg': '查詢成功'}books = models.Book.objects.all()books_ser = BookSer(instance=books, many=True)response['data'] = books_ser.datareturn Response(response)
全局認(rèn)證使用方法設(shè)置:
在settings.py中配置
REST_FRAMEWORK={"DEFAULT_AUTHENTICATION_CLASSES":["app01.my_examine.MyAuth",]}全局認(rèn)證已設(shè)置,視圖中的所有類都會(huì)進(jìn)行設(shè)置值的認(rèn)證,這顯然是不符合實(shí)際的,因?yàn)橛行┮晥D不能設(shè)置認(rèn)證,比如注冊(cè),登錄
所以需要局部對(duì)認(rèn)證進(jìn)行認(rèn)證禁用,方法:
在局部認(rèn)證的視圖類位置添加下述代碼,完成局部禁用 authentication_classes = []
小結(jié):(通過分析源碼)
-如果在項(xiàng)目的setting.py中配置了REST_FRAMEWORK,默認(rèn)先從項(xiàng)目的setting中取
-如果取不到,才去默認(rèn)的drf配置文件中取
-如果用戶在視圖類中配置了某個(gè),先去用戶配置的取
token簡(jiǎn)單描述:
token實(shí)現(xiàn)過程:用戶登錄成功后會(huì)在服務(wù)端通過自己的加密算法算出用戶相關(guān)的并且唯一的一串字符串(token)連同響應(yīng)的數(shù)據(jù)一起發(fā)給前端,前端進(jìn)行保存,在下次用戶訪問發(fā)送請(qǐng)求的時(shí)候會(huì)將token數(shù)據(jù)一并發(fā)給后端服務(wù)器,后端服務(wù)器首先就會(huì)對(duì)token進(jìn)行校驗(yàn)(這個(gè)校驗(yàn)的地方可以是中間件也可以在視圖中),校驗(yàn)的過程大致就是再次通過用戶相關(guān)數(shù)據(jù)進(jìn)行加密算法算出這個(gè)用戶的token字符串,拿現(xiàn)在算出來的token與保存在前端用戶發(fā)送過來的token進(jìn)行匹配,如果一致則代表用戶認(rèn)證登錄成功,當(dāng)然這個(gè)token是可以設(shè)置有效時(shí)間的。在一定程度上緩解了服務(wù)器的壓力。
token產(chǎn)生過程:
比如說我用HMAC-SHA256 算法,加上一個(gè)只有我才知道的密鑰, 對(duì)數(shù)據(jù)做一個(gè)簽名, 把這個(gè)簽名和數(shù)據(jù)一起作為token , 由于密鑰別人不
這個(gè)token服務(wù)端不保存, 前端發(fā)送請(qǐng)求時(shí)候會(huì)捎帶這個(gè)token,我再用同樣的HMAC-SHA256 算法和同樣的密鑰,對(duì)數(shù)據(jù)再計(jì)算一次簽名, 和token中的簽名做個(gè)比較, 如果相同, 我就知道用戶已經(jīng)登錄過了,并且可以直接取到用戶的user id , 如果不相同, 數(shù)據(jù)部分肯定被人篡改過, 我就告訴前端用戶: 對(duì)不起,沒有認(rèn)
Token 中的數(shù)據(jù)是明文保存的(雖然我會(huì)用Base64做下編碼, 但那不是加密), 還是可以被別人看到的, 所以我不能在其中保存像密碼這樣的敏感信息。
當(dāng)然, 如果一個(gè)人的token 被別人偷走了, 那我也沒辦法, 我也會(huì)認(rèn)為小偷就是合法用戶, 這其實(shí)和一個(gè)人的session id 被別人偷走是一樣的。
點(diǎn)我查看更多token相關(guān)信息。
應(yīng)用token編寫登錄接口:
models.py
views.py
# views.pyfrom rest_framework.response import Response from app01.my_examine import MyAuth # Create your views here.from uuid import uuid4 from django.core.exceptions import ObjectDoesNotExist class Login(APIView):def post(self, request):response = {'code': 100, 'msg': '登錄成功'}name = request.data.get('name')password = request.data.get('password')try:# 使用get方法,get方法只能取一條數(shù)據(jù),如果是多條或者取不到,則會(huì)拋異常user = models.User.objects.filter(name=name, password=password).get()# 通過try方法捕獲異常,如果走到這里說明沒有異常,get方法取到用戶對(duì)象,用戶登錄成功# 登錄成功需要進(jìn)行token表的數(shù)據(jù)保存(這里先假設(shè)token是保存在服務(wù)端數(shù)據(jù)庫中)# 生成一個(gè)衛(wèi)衣的id,使用uuid模塊token = uuid4()# token如果在用戶數(shù)據(jù)庫中存在則更新,沒有的話則創(chuàng)建# 使用update_or_create方法models.Token.objects.update_or_create(user=user, defaults={'token': token})# 將token放入返回的字典中response['token'] = token# 捕獲一個(gè)特別的異常,user對(duì)象如果不存在則會(huì)走此處except ObjectDoesNotExist as e:response['code'] = 101response['msg'] = '用戶名或密碼錯(cuò)誤'# 捕獲其它異常except Exception as e:response['code'] = 102response['msg'] = '未知錯(cuò)誤'# 返回前端數(shù)據(jù)return Response(response)添加路由:
url(r'^login/', views.Login.as_view()),二、權(quán)限組件 權(quán)限組件的使用方
法和認(rèn)證組件基本相同:
使用方法:
①寫一個(gè)權(quán)限類,仍然在my_examine.py中:
局部使用:
-在視圖類中寫
permission_classes=[MyPermision,]全局使用:在settings.py中配置
REST_FRAMEWORK={"DEFAULT_PERMISSION_CLASSES":["app01.my_examine.MyPermision",]}局部禁用:
-在視圖類中寫 permission_classes = []
這里可以設(shè)置添加一個(gè)代碼讓返回顯示中文提示:
#在MyPermision類下面添加 message = ‘權(quán)限不足,無法查看’
三、頻率組件
回到頂部
使用方法:
①寫一個(gè)頻率類,仍然在my_examine.py中:
要點(diǎn):繼承SimpleRateThrottle,重寫get_cache_key,返回self.get_ident(request),必須配置一個(gè)scop=字符串
② 在settings.py中配置:
REST_FRAMEWORK = {# 一分鐘內(nèi)只能訪問6次'DEFAULT_THROTTLE_RATES': {'info': '6/m'} }③使用:
局部使用: 在視圖類中配置:
from app01.my_examine import Throttlefrom app01.my_examine import Throttle class PublishView(APIView):throttle_classes = [Throttle, ]def get(self, request):publish_list = models.Publish.objects.all()bs = PublishSer(publish_list, many=True)return Response(bs.data)全局使用:在setting中配置
'DEFAULT_THROTTLE_CLASSES':['自己定義的頻率類'],局部禁用
throttle_classes=[]總結(jié)
以上是生活随笔為你收集整理的Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django框架深入了解_02(DRF之
- 下一篇: Django框架之DRF get pos