DRF的權(quán)限組件(源碼分析)
(資料圖片僅供參考)
DRF的權(quán)限組件(源碼分析)
1. 創(chuàng)建用戶表
from django.db import models# Create your models here.class UserInfo(models.Model): role_choice = ((1, "CEO"), (2, "CTO"), (3, "CFO")) role = models.SmallIntegerField(verbose_name="類型", choices=role_choice, default=1) username = models.CharField(verbose_name="用戶名", max_length=32) password = models.CharField(verbose_name="密碼", max_length=32) token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True)
2. 自定義權(quán)限類
from rest_framework.permissions import BasePermissionclass PermissionA(BasePermission): message = {"code": 1003, "data": "無權(quán)訪問"} def has_permission(self, request, view): if request.user.role == 2: return True return False def has_object_permission(self, request, view, obj): return True
3. 視圖函數(shù)中添加認證
- 局部配置(views.py)
class UserView(APIView): permission_classes = [PermissionA, ] # role權(quán)限 def get(self, request): ...
- 全局配置(settings.py)
REST_FRAMEWORK = { # 權(quán)限 "DEFAULT_PERMISSION_CLASSES": ["app01.permission.PermissionA", ]}
4. 多個權(quán)限類
當(dāng)開發(fā)過程中需要用戶同時具備多個權(quán)限(缺一不可)時,可以用多個權(quán)限類來實現(xiàn)。
權(quán)限組件內(nèi)部處理機制:按照列表的順序逐一執(zhí)行 has_permission
方法,如果返回True,則繼續(xù)執(zhí)行后續(xù)的權(quán)限類;如果返回None或False,則拋出權(quán)限異常并停止后續(xù)權(quán)限類的執(zhí)行。
# models.pyfrom django.db import modelsclass Role(models.Model): """ 角色表 """ title = models.CharField(verbose_name="名稱", max_length=32)class UserInfo(models.Model): """ 用戶表 """ username = models.CharField(verbose_name="用戶名", max_length=32) password = models.CharField(verbose_name="密碼", max_length=64) token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True) roles = models.ManyToManyField(verbose_name="角色", to="Role")
# urls.pyfrom django.urls import path, re_path, includefrom app01 import viewsurlpatterns = [ path("api/auth/", views.AuthView.as_view()), path("api/order/", views.OrderView.as_view()),]
# views.pyimport uuidfrom rest_framework.views import APIViewfrom rest_framework.request import Requestfrom rest_framework.response import Responsefrom rest_framework.authentication import BaseAuthenticationfrom rest_framework.permissions import BasePermissionfrom rest_framework.exceptions import AuthenticationFailedfrom app01 import modelsclass AuthView(APIView): """ 用戶登錄認證 """ def post(self, request, *args, **kwargs): print(request.data) # {"username": "wupeiqi", "password": "123"} username = request.data.get("username") password = request.data.get("password") user_object = models.UserInfo.objects.filter(username=username, password=password).first() if not user_object: return Response({"code": 1000, "data": "用戶名或密碼錯誤"}) token = str(uuid.uuid4()) user_object.token = token user_object.save() return Response({"code": 0, "data": {"token": token, "name": username}})class TokenAuthentication(BaseAuthentication): def authenticate(self, request): token = request.query_params.get("token") if not token: raise AuthenticationFailed({"code": 1002, "data": "認證失敗"}) user_object = models.UserInfo.objects.filter(token=token).first() if not user_object: raise AuthenticationFailed({"code": 1002, "data": "認證失敗"}) return user_object, token def authenticate_header(self, request): return "Bearer realm="API""class PermissionA(BasePermission): message = {"code": 1003, "data": "無權(quán)訪問"} def has_permission(self, request, view): exists = request.user.roles.filter(title="員工").exists() if exists: return True return False def has_object_permission(self, request, view, obj): return Trueclass PermissionB(BasePermission): message = {"code": 1003, "data": "無權(quán)訪問"} def has_permission(self, request, view): exists = request.user.roles.filter(title="主管").exists() if exists: return True return False def has_object_permission(self, request, view, obj): return Trueclass OrderView(APIView): authentication_classes = [TokenAuthentication, ] permission_classes = [PermissionA, PermissionA] def get(self, request, *args, **kwargs): return Response({"code": 0, "data": {"user": None, "list": [1, 2, 3]}})class PayView(APIView): authentication_classes = [TokenAuthentication, ] permission_classes = [PermissionA, ] def get(self, request, *args, **kwargs): return Response({"code": 0, "data": "數(shù)據(jù)..."})
5. 關(guān)于has_object_permission
后期補充...
6. 源碼分析
第三步前面的部分執(zhí)行流程和前兩篇文章是一樣的. 這里就不過多贅述了
標(biāo)簽:
相關(guān)文章
DRF的權(quán)限組件(源碼分析)
?DRF的權(quán)限組件(源碼分析)1 創(chuàng)建用戶表fromdjango dbimportmodels Createyourmodelshere classUserInfo(model
郭德綱夫人王慧圖片_郭德綱夫人王慧
?1、郭德綱老婆王慧,原天津著名京韻大鼓演員,現(xiàn)在管理德云社及其其他產(chǎn)業(yè)。2、天津著名京韻大鼓演員,著名
環(huán)球觀速訊丨春日打卡必勝客,開啟一段沉浸式“非遺盛宴”
?近日,一場別開生面的“上海非遺金山農(nóng)民畫體驗活動“在必勝客上海邯鄲餐廳舉辦?;顒又?,非遺代表性傳承人
央行對2家拒收人民幣現(xiàn)金的單位及責(zé)任人作出處罰
?4月21日,央行發(fā)布2023年第一季度拒收人民幣現(xiàn)金處罰情況,依法對2家拒收人民幣現(xiàn)金的單位及相關(guān)責(zé)任人作出
仕佳光子(688313)2023年一季報簡析:凈利潤減113.98%,三費占比上升明顯
?據(jù)證券之星公開數(shù)據(jù)整理,近期仕佳光子(688313)發(fā)布2023年一季報。根據(jù)財報顯示,本報告期中仕佳光子凈利
??谛阌^(qū)招商推介會北京站成功舉辦[圖]_世界短訊
?近日,??谑行阌^(qū)“錦繡自貿(mào)港群英共未來”招商推介會北京站成功舉辦,吸引了丹麥CG集團、百度智能云、北
3年的堅持與守護,杭州南站志愿者只為完成一個承諾!
?4月20日,杭州南站志愿服務(wù)隊收到了一份來自“老朋友”的禮物。殘疾人旅客潘和忠向杭州南站志愿服務(wù)隊送上
車?yán)遄雍蜋烟沂且环N水果嗎_車?yán)遄邮遣皇菣烟?熱訊
?車?yán)遄雍蜋烟沂且环N水果嗎,車?yán)遄邮遣皇菣烟液芏嗳诉€不知道,現(xiàn)在讓我們一起來看看吧!解答:1、櫻桃就是
商務(wù)部:一季度我國企業(yè)承接服務(wù)外包合同額5768億元 同比增長18.2%|當(dāng)前時訊
?2023年一季度,我國企業(yè)承接服務(wù)外包合同額5768億元人民幣,執(zhí)行額3961億元,同比分別增長18 2%和24 4%。
我的世界信標(biāo)放在哪里比較好_我的世界信標(biāo)怎么擺放才可以有全效果|天天熱頭條
?1、九個格子方鐵 黃金 鉆石 綠寶石塊鐵鐵鐵鐵鐵鐵鐵鐵鐵鐵鐵鐵鐵信標(biāo)鐵鐵鐵鐵。本文分享完畢,希望對大家有
環(huán)球熱文:外交部發(fā)言人:敦促美國等發(fā)達國家審慎評估自身經(jīng)濟金融政策外溢影響
?新華社北京4月20日電(記者馬卓言)外交部發(fā)言人汪文斌20日表示,當(dāng)前國際金融風(fēng)險突出,同美國等發(fā)達國家
瀘州老窖:公司擁有數(shù)十萬噸的基酒儲存能力,不同產(chǎn)品有不同的儲存時間要求
?瀘州老窖00056804月21日在投資者關(guān)系平臺上答復(fù)了投資者關(guān)心的問題投資者您好尊敬的董秘山東淄博燒烤火遍全
今日時訊:足球報玉昆接過大旗為云南而戰(zhàn) 牛洪利重返夢想之地為云南打造名片_環(huán)球即時
?小伙伴們好,帶大家回顧下足球報玉昆接過大旗為云南而戰(zhàn)牛洪利重返夢想之地為云南打造名片,那么小縱今天就
景甜訴廣告公司侵權(quán) 廣告公司涉侵權(quán)糾紛被景甜起訴|最新資訊
?天眼查App顯示,近日,上海網(wǎng)策廣告有限公司新增開庭公告,案由為網(wǎng)絡(luò)侵權(quán)責(zé)任糾紛,原告為景甜,該案將于5
【世界報資訊】阿卡索外教課好嗎_阿卡索外教怎么樣
?1、阿卡索外教老師是第一大坑。2、阿卡索外教一直強調(diào)他們是歐美老師上課,還保證每天都能上課。3、實際上
以色列駐華大使在2023年世界地球日前夕呼吁各方合作 創(chuàng)新應(yīng)對環(huán)境問題
?國際在線消息(記者潘曉琳):為迎接2023年世界地球日(每年4月22日),4月19日,以色列駐華大使潘綺瑞(H E
知識產(chǎn)權(quán)為“制造業(yè)當(dāng)家”添動能
?加強知識產(chǎn)權(quán)法治保障,才能有力支持全面創(chuàng)新,昨晚(20日),2023年全國知識產(chǎn)權(quán)宣傳周活動啟動儀式的分會
【天天聚看點】浙江省博物館武林館區(qū)閉館后再也不開了嗎?
?浙江省博物館武林館區(qū)閉館后再也不開了嗎?浙江省博物館武林館將于2023年5月4日正式閉館,閉館后將搬遷至浙
天天日報丨河北古稀皮影人:在流轉(zhuǎn)的燈影里守護傳承
?河北古稀皮影人:在流轉(zhuǎn)的燈影里守護傳承 【解說】在河北省秦皇島市昌黎縣有一種古老的劇種——皮影戲,
天天速訊:鐘聲:霸權(quán)霸道霸凌行徑破壞和平、侵犯人權(quán)
?美國白宮日前發(fā)布阿富汗撤軍行動調(diào)查報告,承認在撤軍過程中存在“巨大的情報失敗”,將倉皇撤軍責(zé)任歸咎于
jpg和pdf哪個更清晰_jpg 和PDF的區(qū)別-天天快報
?1、PDF格式是由Adobe公司推出的專為網(wǎng)上出版而制訂的。2、它以PostscriptLevel2語言為基礎(chǔ),可以
新冠病毒 XBB.1.16 可能引發(fā)結(jié)膜炎,專家:無需太過擔(dān)憂 快播
?(人民日報健康客戶端記者張爽楊曉露)4月18日,奧密克戎亞種XBB 1 16引起廣泛討論,XBB 1 16感染者出現(xiàn)結(jié)
2023年4月20日雞蛋價格偏強而行金十期貨4月20日訊,當(dāng)前我國在產(chǎn)蛋雞存欄整體仍偏低,庫存不大,供應(yīng)上仍能提供支撐
?2023年4月20日雞蛋價格偏強而行金十期貨4月20日訊,當(dāng)前我國在產(chǎn)蛋雞存欄整體仍偏低,庫存不大,供應(yīng)上仍能
國光電器(002045):技術(shù)指標(biāo)出現(xiàn)看漲信號-KDJ 低位金叉(04-20) 環(huán)球速遞
?從技術(shù)指標(biāo)上看,國光電器(002045)出現(xiàn)看漲信號-KDJ低位金叉,后續(xù)有望上漲。資金流向數(shù)據(jù):主力資金凈流
【世界獨家】甘肅省古浪縣市場監(jiān)管局開展農(nóng)資打假保春耕專項行動
?為進一步規(guī)范農(nóng)資市場經(jīng)營秩序,嚴(yán)厲打擊制售假冒偽劣農(nóng)資等違法行為,甘肅省古浪縣市場監(jiān)管局在全縣范圍內(nèi)
黃金TD今日走勢如何?2022年3月7日黃金TD價格多少?
?周一(3月7日),黃金TD維持小幅上漲。本交易日,黃金TD開于372 3元 克,最高上探至380 48元 克,最低下探371
大宗交易:招商銀行成交1.31億元,成交均價34.50元(04-21)
?2023年4月21日,招商銀行發(fā)生3筆大宗交易,總成交380萬股,成交金額1 31億元,成交均價34 50元,成交價與收
新資訊:北方國際4月21日盤中跌幅達5%
?以下是北方國際在北京時間4月21日14:47分盤口異動快照:4月21日,北方國際盤中跌幅達5%,截至14點47分,報1