[Python學習] Django 權限控制


本文為大家講解 Django 框架里自帶的權限模型遍搞,從理論到實戰(zhàn)演練疗认,帶領大家了解 Django 里權限是怎么一回事较锡。

主要內容

什么是權限管理业稼?
Web 權限
Django 權限機制
Django 的權限項
權限應用

  • Permission(一)
  • Permission(二)
  • User Permission 管理(一)
  • User Permission 管理(二)
  • Group Permission 管理
  • 權限驗證(一)
  • 權限驗證(二)
  • 權限驗證(三)
  • 權限驗證(四)

什么是權限管理

權限管理,一般指根據(jù)系統(tǒng)設置的安全規(guī)則或者安全策略念链,用戶可以訪問而且只能訪問自己被授權的資源

權限管理好比如鑰匙盼忌,有了鑰匙就能把門打開积糯,但是權限設置是有級別之分的掂墓,假如這個系統(tǒng)有多個權限級別就如一間屋有多個門,想要把所有門都打開您必須要取得所有的鑰匙看成,就如系統(tǒng)一樣君编。

Web 權限

在 Web 里權限管理是 Web 應用項目中比較關鍵的環(huán)節(jié),因為瀏覽器是每一臺計算機都已具備的川慌,如果不建立權限管理系統(tǒng)吃嘿,那么一個“非法用戶”可以輕而易舉通過瀏覽器訪問Web應用項目中的所有功能。因此需要權限管理系統(tǒng)進行權限檢測梦重,讓經(jīng)過授權的用戶可以正常合法的使用已授權的功能兑燥,而對那些未授權的非法用戶拒之門外。 一個好的權限管理系統(tǒng)應該對每一類或每一個用戶琴拧,分配不同的系統(tǒng)操作權限降瞳,并應具有擴展性,也就是它可以加入到任何一個帶有權限管理的 Web 應用項目中蚓胸,就像構件一樣可以被重復使用挣饥。 同時,還要提醒開發(fā)者沛膳,開發(fā)一個 Web 應用項目時扔枫,應盡可能的將整個系統(tǒng)細化,分解為若干個子模塊锹安,最后組合成一個完整的應用短荐。也只有這樣倚舀,才容易實現(xiàn)為每一類或每一個用戶分配不同的操作權限。

Django 權限機制

Django 權限機制能夠約束用戶行為忍宋,控制頁面的顯示內容瞄桨,也能使 API 更加安全和靈活;用好權限機制讶踪,能讓系統(tǒng)更加強大和健壯

Django 用 user, group 和 permission 完成了權限機制芯侥,這個權限機制是將屬于 model 的某個 permission 賦予 user 或 group,可以理解為全局的權限乳讥,即如果用戶A對數(shù)據(jù)模型(model)B 有可寫權限柱查,那么 A 能修改model B 的所有實例(objects)。group 的權限也是如此云石,如果為 group C 賦予 model B 的可寫權限唉工,則隸屬于 group C 的所有用戶,都可以修改model B 的所有實例汹忠。

Django 的權限項

Django 用 permission 對象存儲權限項淋硝,每個model默認都有三個permission,即 add model, change model 和 delete model

permission 總是與 model 對應的宽菜,如果一個 object 不是 model 的實例谣膳,我們無法為它創(chuàng)建/分配權限

權限應用

  • Permission
  • User Permission
  • Group Permission
  • 權限檢查

◆ Permission(一)
Django 定義每個 model 后,默認都會添加該 model 的 add, change 和 delete三個 permission铅乡,自定義的 permission 可以在我們定義 model 時手動添加

class Server(models.Model):
     ...    
    class Meta:        
        permissions = (            
            ("view_server", "can view server"),            
            ("change_server_status", "Can change the status of server"),        
        )

◆ Permission(二)

每個 permission 都是 django.contrib.auth.Permission 類型的實例继谚,該類型包含三個字段 name, codename 和 content_type,
content_type 反應了 permission 屬于哪個 model阵幸,
codename 如上面的 view_server花履,代碼邏輯中檢查權限時要用,
name 是 permission 的描述挚赊,將 permission 打印到屏幕或頁面時默認顯示的就是 name
◆ User Permission管理(一)
User 對象的 user_permission 字段管理用戶的權限
user = User.objects.get(username="rock")
user.user_permissions = [permission_list]
user.user_permissions.add(permission, permission, …) #增加權限
user.user_permissions.remove(permission, permission, …) #刪除權限
user.user_permissions.clear() #清空權限
注:上面的 permission 為 django.contrib.auth.Permission 類型的實例

# 示例演示:
In [3]: from django.contrib.auth.models import User    #導入用戶模塊
In [6]: user = User.objects.get(username="nick")     #獲取用戶對象
In [7]: user.user_permissions.all()                        # 查看用戶權限
Out[7]: []
In [8]: from django.contrib.auth.models import Permission    #導入權限模塊
In [10]: Permission.objects.get(pk=43)                        #獲取權限信息
Out[10]: <Permission: dashboard | server | 訪問服務器信息>
In [11]: Permission.objects.filter(pk=43)                        #獲取權限信息(以列表形式輸出)
Out[11]: [<Permission: dashboard | server | 訪問服務器信息>]
In [12]: user.user_permissions = Permission.objects.filter(pk=43)      #賦予用戶權限(賦予權限不需要保存)
In [13]: user.user_permissions.all()                        #查看用戶當前權限
Out[13]: [<Permission: dashboard | server | 訪問服務器信息>]
In [18]: user.user_permissions.add(Permission.objects.get(pk=43))            #add添加權限(必須是一個Permission實例诡壁,否則報錯)
In [40]: user.user_permissions.all()
Out[40]: [<Permission: dashboard | department | Can change department>, <Permission: dashboard | server | 訪問服務器信息>]
In [41]: user.user_permissions.remove(Permission.objects.get(pk=43))      #remove移除權限(必須是一個Permission實例,否則報錯)
In [42]: user.user_permissions.all()
Out[42]: [<Permission: dashboard | department | Can change department>]

◆ User Permission 管理(二)

  • 檢查用戶權限用 has_perm() 方法:
myuser.has_perm(’dashboard.view_server')

has_perm() 方法的參數(shù)荠割,即 permission 的 codename妹卿,但傳遞參數(shù)時需要加上 model 所屬 app 的前綴,無論 permission 賦予 user 還是 group涨共,has_perm()方法均適用

  • 列出用戶的所有權限
user.get_all_permissions()
  • 列出用戶所屬group的權限
user.get_group_permissions()

◆ Group Permission 管理
group permission 管理邏輯與 user permission 管理一致纽帖,group 中使用permissions 字段做權限管理:
group.permissions = [permission_list]
group.permissions.add(permission, permission, …)
group.permissions.remove(permission, permission, …)
group.permissions.clear()

◆ 權限驗證(一)
在視圖中驗證權限—— permission_required
當業(yè)務邏輯中涉及到權限檢查時,decorator 能夠分離權限驗證和核心的業(yè)務邏輯举反,使代碼更簡潔懊直,邏輯更清晰。permission 的 decorator 為permission_required

from django.contrib.auth.decorators import permission_required 
@permission_required(’dashboard.view_server') 
def my_view(request):
    ...

◆ 權限驗證(二)

在類視圖中驗證

from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required, permission_required
class ServerView(TemplateView):
    @method_decorator(login_required)
    @method_decorator(permission_required(“dashboard.view_server”)
    def get(self, request, *args, **kwargs):
   ……

◆ 權限驗證(三)

views 中驗證

if not request.user.has_perm(’dashboard.view_server')
    return HttpResponse('Forbidden')

◆ 權限驗證(四)

Template 中的權限檢查

{% if perms.dashboard.view_server %}    
    有權限
{% endif %}

◆ 擴展閱讀:

使用 Django 認證系統(tǒng):http://python.usyiyi.cn/translate/django_182/topics/auth/default.html


Python 實戰(zhàn)班第16期火熱報名進行中

招生要求:

想往開發(fā)或者運維開發(fā)方向發(fā)展火鼻,Python 基礎為零或薄弱室囊,但能讀懂 shell 或者其它任何一門語言的同學雕崩。

課程內容:

◆精簡版 CMDB

1、html+css+js 多種前端技術結合

2融撞、ajax 異步請求操作

3盼铁、分頁搜索功能

4、常見數(shù)據(jù)庫設計原則尝偎、CMDB 表結構實戰(zhàn)饶火、Mysql 實操

5、獨立完項目致扯、了解完整的 Web(LAMP) 架構

◆Nginx 日志統(tǒng)計分析與多維可視化

1肤寝、用 Python 處理 Nginx 日志文件,進行多維度數(shù)據(jù)統(tǒng)計分析

2抖僵、根據(jù) ip鲤看、訪問地址和訪問狀態(tài)等數(shù)據(jù)統(tǒng)計,統(tǒng)計結果存入數(shù)據(jù)庫

3耍群、Highcharts 等流行前端技術多維度义桂,將分析結果可視化展示

◆快速構建實用監(jiān)控系統(tǒng)

1、Python 讀取機器的實時使用數(shù)據(jù)蹈垢,通過 Http 請求將數(shù)據(jù)入庫

2慷吊、設計數(shù)據(jù)入庫的 API,收集不同機器的數(shù)據(jù)

3耘婚、前端將內存數(shù)據(jù)讀出罢浇,視化展示折線圖

4陆赋、獨立完成項目沐祷,掌握 Python 常用的 time 等模塊

咨詢報名聯(lián)系:
QQ(1):979950755 小月
QQ(2):279312229 ada
WeChat : 1902433859 小月
WeChat : 1251743084 小單

開課時間:9月9日

課程大綱:http://51reboot.com/course/actual/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市攒岛,隨后出現(xiàn)的幾起案子赖临,更是在濱河造成了極大的恐慌,老刑警劉巖灾锯,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兢榨,死亡現(xiàn)場離奇詭異,居然都是意外死亡顺饮,警方通過查閱死者的電腦和手機吵聪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兼雄,“玉大人吟逝,你說我怎么就攤上這事∩饫撸” “怎么了块攒?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵励稳,是天一觀的道長。 經(jīng)常有香客問我囱井,道長驹尼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任庞呕,我火速辦了婚禮新翎,結果婚禮上,老公的妹妹穿的比我還像新娘住练。我一直安慰自己料祠,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布澎羞。 她就那樣靜靜地躺著髓绽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妆绞。 梳的紋絲不亂的頭發(fā)上顺呕,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音括饶,去河邊找鬼株茶。 笑死,一個胖子當著我的面吹牛图焰,可吹牛的內容都是我干的启盛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼技羔,長吁一口氣:“原來是場噩夢啊……” “哼僵闯!你這毒婦竟也來了?” 一聲冷哼從身側響起藤滥,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤鳖粟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拙绊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體向图,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年标沪,在試婚紗的時候發(fā)現(xiàn)自己被綠了榄攀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡金句,死狀恐怖檩赢,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情趴梢,我是刑警寧澤漠畜,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布币他,位于F島的核電站,受9級特大地震影響憔狞,放射性物質發(fā)生泄漏蝴悉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一瘾敢、第九天 我趴在偏房一處隱蔽的房頂上張望拍冠。 院中可真熱鬧,春花似錦簇抵、人聲如沸庆杜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晃财。三九已至,卻和暖如春典蜕,著一層夾襖步出監(jiān)牢的瞬間断盛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工愉舔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钢猛,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓轩缤,卻偏偏與公主長得像命迈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子火的,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容