Django權(quán)限設(shè)置及驗(yàn)證方式
當(dāng)創(chuàng)建一個(gè)Models, 在同步到數(shù)據(jù)庫(kù)里,django默認(rèn)設(shè)置了三個(gè)權(quán)限 ,就是 add, change, delete權(quán)限。但是往往有時(shí)候,根本不夠用,此時(shí)我們可以自己寫(xiě)一個(gè)腳本,來(lái)進(jìn)行權(quán)限的設(shè)置.
根據(jù)DJango官方文檔解釋,權(quán)限都是與models有關(guān)系的,此時(shí).如果想設(shè)置一個(gè)view,對(duì)于有權(quán)限的用戶進(jìn)行放行,對(duì)于無(wú)權(quán)限的用戶進(jìn)行限制.那么我們就可以著手來(lái)寫(xiě)這個(gè)需求.
驗(yàn)證權(quán)限的方法一般有兩種,一種是用@permission_required來(lái)進(jìn)行驗(yàn)證,第二中是用user.has_perm()在函數(shù)里進(jìn)行驗(yàn)證,通過(guò)返回的True或者False來(lái)進(jìn)行下一步
同時(shí)我的稍微復(fù)雜一些,是在django中加入了第三方認(rèn)證oauth2,并限制跨域訪問(wèn)的資源.具體見(jiàn)我之前的文章.
具體步驟如下:
第一步:
設(shè)置跨域訪問(wèn)資源范圍,如下:
CORS_URLS_REGEX = r'^/(o|api/oauth/).*$'
#只允許跨域訪問(wèn)url為/o/....或者/api/oauth/...的資源
第二步:
寫(xiě)一個(gè)設(shè)置permission腳本,或者你自己創(chuàng)建一個(gè)model,然后migrate得到django默認(rèn)提供的三個(gè)權(quán)限,當(dāng)然,這過(guò)于繁瑣和單一,你也可以自定義permission,在你創(chuàng)建的model里添加Meta類,然后創(chuàng)建你的自定義permission.如下:
class **Model(): .... class Meta: permissions = ( (can_read'', '查看'), (can_delete'', '刪除'), )
或者, 你可以自己寫(xiě)一個(gè)創(chuàng)建permission的文件.這里,我的需求是根據(jù)用戶來(lái)限制是否訪問(wèn)資源,直接在User上來(lái)進(jìn)行permission設(shè)置,如下:
from django.contrib.auth.models import Permission, User from django.contrib.contenttypes.models import ContentType def run(codename, name): content_type = ContentType.objects.get_for_model(User) permission = Permission.objects.get_or_create(codename=codename, name=name, content_type=content_type) return permission
運(yùn)行run即可創(chuàng)建指定codename的permission,這與用戶是綁定的.
第三步:
驗(yàn)證權(quán)限,最主要的有兩種方法,用裝飾器方法,或者在函數(shù)里用has_perm/has_perms,我這里使用裝飾器方法,當(dāng)然.最開(kāi)始我自己手寫(xiě)了一個(gè)驗(yàn)證裝飾器,后來(lái)發(fā)現(xiàn),django有自帶的,也比較好用,直接在views函數(shù)錢(qián)@permission_required(perms)即可.
由于此處我用的是django的視通函數(shù),無(wú)法直接在函數(shù)前加@permission_required(perms),需要用到如下方法,可以將函數(shù)裝飾器改為方法或類裝飾器的方法,django自帶的@method_decorator(decorator),
用法如下
class LimitView(ProtectedResourceView): @method_decorator(permission_required(per_list[0])) def get(self, request): ....
LimitView為我自己的視圖函數(shù),繼承自oauth的ProtectedResourceView,作用是保護(hù)視圖函數(shù)不被授權(quán)用戶查看.permission_required參數(shù)為用戶需要擁有的權(quán)限,如果有,可以正常訪問(wèn),否則,會(huì)重定向到登錄頁(yè)面,或者你可以在此處自己指定轉(zhuǎn)向頁(yè)面.
需要注意的是使用@permission_required(perms)時(shí)request.user需有字段,否則會(huì)報(bào)錯(cuò).我這里沒(méi)有登錄也可以訪問(wèn)授權(quán)是因?yàn)槲沂褂昧擞脩粼试S的授權(quán)碼訪問(wèn),會(huì)直接在request中設(shè)置user字段為該access_token對(duì)應(yīng)的user.
補(bǔ)充知識(shí):django 校驗(yàn)用戶是否有權(quán)限
views中判斷是否有權(quán)限:
{% if request.user.has_perm('app.權(quán)限名')%} …… {%endif%}
html中根據(jù)權(quán)限判斷控件是否顯示:
{% if perms.appname.codename%}
{% endif%}
切記:要想html中變量生效,必須傳入RequestContext,views.py中必須是render(request,'xx.html',{}),這個(gè)問(wèn)題糾結(jié)很久。
參考django文檔:https://docs.djangoproject.com/en/2.1/topics/auth/default/#permissions
以上這篇Django權(quán)限設(shè)置及驗(yàn)證方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python3.8官網(wǎng)文檔之類的基礎(chǔ)語(yǔ)法閱讀
類提供了一種組合數(shù)據(jù)和功能的方法,今天通過(guò)本文給大家分享Python3.8官網(wǎng)文檔之類的基礎(chǔ)語(yǔ)法閱讀知識(shí),感興趣的朋友跟隨小編一起看看吧2021-09-09Python Django框架實(shí)現(xiàn)應(yīng)用添加logging日志操作示例
這篇文章主要介紹了Python Django框架實(shí)現(xiàn)應(yīng)用添加logging日志操作,結(jié)合實(shí)例形式分析了Django框架中添加Python內(nèi)建日志模塊相關(guān)操作技巧,需要的朋友可以參考下2019-05-05Python棧的實(shí)現(xiàn)方法示例【列表、單鏈表】
這篇文章主要介紹了Python棧的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python基于列表、單鏈表定義棧的相關(guān)操作技巧,需要的朋友可以參考下2020-02-02Pycharm連接遠(yuǎn)程服務(wù)器過(guò)程圖解
這篇文章主要介紹了Pycharm連接遠(yuǎn)程服務(wù)器過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04基于python,Matplotlib繪制函數(shù)的等高線與三維圖像
這篇文章主要介紹了基于python,Matplotlib繪制函數(shù)的等高線與三維圖像,函數(shù)的等高線及其三維圖像的可視化方法,下面一起來(lái)學(xué)習(xí)具體內(nèi)容吧,需要的小伙伴可以參考一下2022-01-01python3通過(guò)udp實(shí)現(xiàn)組播數(shù)據(jù)的發(fā)送和接收操作
這篇文章主要介紹了python3通過(guò)udp實(shí)現(xiàn)組播數(shù)據(jù)的發(fā)送和接收操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05python中的項(xiàng)目目錄結(jié)構(gòu)
這篇文章主要介紹了python中的項(xiàng)目目錄結(jié)構(gòu),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02