
本文為大家講解 Django 框架里自帶的權(quán)限模型,從理論到實(shí)戰(zhàn)演練,帶領(lǐng)大家了解 Django 里權(quán)限是怎么一回事。
主要內(nèi)容
什么是權(quán)限管理?
Web 權(quán)限
Django 權(quán)限機(jī)制
Django 的權(quán)限項(xiàng)
權(quán)限應(yīng)用
- Permission(一)
- Permission(二)
- User Permission 管理(一)
- User Permission 管理(二)
- Group Permission 管理
- 權(quán)限驗(yàn)證(一)
- 權(quán)限驗(yàn)證(二)
- 權(quán)限驗(yàn)證(三)
- 權(quán)限驗(yàn)證(四)
什么是權(quán)限管理
權(quán)限管理,一般指根據(jù)系統(tǒng)設(shè)置的安全規(guī)則或者安全策略,用戶可以訪問(wèn)而且只能訪問(wèn)自己被授權(quán)的資源
權(quán)限管理好比如鑰匙,有了鑰匙就能把門打開(kāi),但是權(quán)限設(shè)置是有級(jí)別之分的,假如這個(gè)系統(tǒng)有多個(gè)權(quán)限級(jí)別就如一間屋有多個(gè)門,想要把所有門都打開(kāi)您必須要取得所有的鑰匙,就如系統(tǒng)一樣。
Web 權(quán)限
在 Web 里權(quán)限管理是 Web 應(yīng)用項(xiàng)目中比較關(guān)鍵的環(huán)節(jié),因?yàn)闉g覽器是每一臺(tái)計(jì)算機(jī)都已具備的,如果不建立權(quán)限管理系統(tǒng),那么一個(gè)“非法用戶”可以輕而易舉通過(guò)瀏覽器訪問(wèn)Web應(yīng)用項(xiàng)目中的所有功能。因此需要權(quán)限管理系統(tǒng)進(jìn)行權(quán)限檢測(cè),讓經(jīng)過(guò)授權(quán)的用戶可以正常合法的使用已授權(quán)的功能,而對(duì)那些未授權(quán)的非法用戶拒之門外。 一個(gè)好的權(quán)限管理系統(tǒng)應(yīng)該對(duì)每一類或每一個(gè)用戶,分配不同的系統(tǒng)操作權(quán)限,并應(yīng)具有擴(kuò)展性,也就是它可以加入到任何一個(gè)帶有權(quán)限管理的 Web 應(yīng)用項(xiàng)目中,就像構(gòu)件一樣可以被重復(fù)使用。 同時(shí),還要提醒開(kāi)發(fā)者,開(kāi)發(fā)一個(gè) Web 應(yīng)用項(xiàng)目時(shí),應(yīng)盡可能的將整個(gè)系統(tǒng)細(xì)化,分解為若干個(gè)子模塊,最后組合成一個(gè)完整的應(yīng)用。也只有這樣,才容易實(shí)現(xiàn)為每一類或每一個(gè)用戶分配不同的操作權(quán)限。
Django 權(quán)限機(jī)制
Django 權(quán)限機(jī)制能夠約束用戶行為,控制頁(yè)面的顯示內(nèi)容,也能使 API 更加安全和靈活;用好權(quán)限機(jī)制,能讓系統(tǒng)更加強(qiáng)大和健壯
Django 用 user, group 和 permission 完成了權(quán)限機(jī)制,這個(gè)權(quán)限機(jī)制是將屬于 model 的某個(gè) permission 賦予 user 或 group,可以理解為全局的權(quán)限,即如果用戶A對(duì)數(shù)據(jù)模型(model)B 有可寫(xiě)權(quán)限,那么 A 能修改model B 的所有實(shí)例(objects)。group 的權(quán)限也是如此,如果為 group C 賦予 model B 的可寫(xiě)權(quán)限,則隸屬于 group C 的所有用戶,都可以修改model B 的所有實(shí)例。
Django 的權(quán)限項(xiàng)
Django 用 permission 對(duì)象存儲(chǔ)權(quán)限項(xiàng),每個(gè)model默認(rèn)都有三個(gè)permission,即 add model, change model 和 delete model
permission 總是與 model 對(duì)應(yīng)的,如果一個(gè) object 不是 model 的實(shí)例,我們無(wú)法為它創(chuàng)建/分配權(quán)限
權(quán)限應(yīng)用
- Permission
- User Permission
- Group Permission
- 權(quán)限檢查
◆ Permission(一)
Django 定義每個(gè) model 后,默認(rèn)都會(huì)添加該 model 的 add, change 和 delete三個(gè) permission,自定義的 permission 可以在我們定義 model 時(shí)手動(dòng)添加
class Server(models.Model):
...
class Meta:
permissions = (
("view_server", "can view server"),
("change_server_status", "Can change the status of server"),
)
◆ Permission(二)
每個(gè) permission 都是 django.contrib.auth.Permission 類型的實(shí)例,該類型包含三個(gè)字段 name, codename 和 content_type,
content_type 反應(yīng)了 permission 屬于哪個(gè) model,
codename 如上面的 view_server,代碼邏輯中檢查權(quán)限時(shí)要用,
name 是 permission 的描述,將 permission 打印到屏幕或頁(yè)面時(shí)默認(rèn)顯示的就是 name
◆ User Permission管理(一)
User 對(duì)象的 user_permission 字段管理用戶的權(quán)限
user = User.objects.get(username="rock")
user.user_permissions = [permission_list]
user.user_permissions.add(permission, permission, …) #增加權(quán)限
user.user_permissions.remove(permission, permission, …) #刪除權(quán)限
user.user_permissions.clear() #清空權(quán)限
注:上面的 permission 為 django.contrib.auth.Permission 類型的實(shí)例
# 示例演示:
In [3]: from django.contrib.auth.models import User #導(dǎo)入用戶模塊
In [6]: user = User.objects.get(username="nick") #獲取用戶對(duì)象
In [7]: user.user_permissions.all() # 查看用戶權(quán)限
Out[7]: []
In [8]: from django.contrib.auth.models import Permission #導(dǎo)入權(quán)限模塊
In [10]: Permission.objects.get(pk=43) #獲取權(quán)限信息
Out[10]: <Permission: dashboard | server | 訪問(wèn)服務(wù)器信息>
In [11]: Permission.objects.filter(pk=43) #獲取權(quán)限信息(以列表形式輸出)
Out[11]: [<Permission: dashboard | server | 訪問(wèn)服務(wù)器信息>]
In [12]: user.user_permissions = Permission.objects.filter(pk=43) #賦予用戶權(quán)限(賦予權(quán)限不需要保存)
In [13]: user.user_permissions.all() #查看用戶當(dāng)前權(quán)限
Out[13]: [<Permission: dashboard | server | 訪問(wèn)服務(wù)器信息>]
In [18]: user.user_permissions.add(Permission.objects.get(pk=43)) #add添加權(quán)限(必須是一個(gè)Permission實(shí)例,否則報(bào)錯(cuò))
In [40]: user.user_permissions.all()
Out[40]: [<Permission: dashboard | department | Can change department>, <Permission: dashboard | server | 訪問(wèn)服務(wù)器信息>]
In [41]: user.user_permissions.remove(Permission.objects.get(pk=43)) #remove移除權(quán)限(必須是一個(gè)Permission實(shí)例,否則報(bào)錯(cuò))
In [42]: user.user_permissions.all()
Out[42]: [<Permission: dashboard | department | Can change department>]
◆ User Permission 管理(二)
- 檢查用戶權(quán)限用 has_perm() 方法:
myuser.has_perm(’dashboard.view_server')
has_perm() 方法的參數(shù),即 permission 的 codename,但傳遞參數(shù)時(shí)需要加上 model 所屬 app 的前綴,無(wú)論 permission 賦予 user 還是 group,has_perm()方法均適用
- 列出用戶的所有權(quán)限
user.get_all_permissions()
- 列出用戶所屬group的權(quán)限
user.get_group_permissions()
◆ Group Permission 管理
group permission 管理邏輯與 user permission 管理一致,group 中使用permissions 字段做權(quán)限管理:
group.permissions = [permission_list]
group.permissions.add(permission, permission, …)
group.permissions.remove(permission, permission, …)
group.permissions.clear()
◆ 權(quán)限驗(yàn)證(一)
在視圖中驗(yàn)證權(quán)限—— permission_required
當(dāng)業(yè)務(wù)邏輯中涉及到權(quán)限檢查時(shí),decorator 能夠分離權(quán)限驗(yàn)證和核心的業(yè)務(wù)邏輯,使代碼更簡(jiǎn)潔,邏輯更清晰。permission 的 decorator 為permission_required
from django.contrib.auth.decorators import permission_required
@permission_required(’dashboard.view_server')
def my_view(request):
...
◆ 權(quán)限驗(yàn)證(二)
在類視圖中驗(yàn)證
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):
……
◆ 權(quán)限驗(yàn)證(三)
views 中驗(yàn)證
if not request.user.has_perm(’dashboard.view_server')
return HttpResponse('Forbidden')
◆ 權(quán)限驗(yàn)證(四)
Template 中的權(quán)限檢查
{% if perms.dashboard.view_server %}
有權(quán)限
{% endif %}
◆ 擴(kuò)展閱讀:
使用 Django 認(rèn)證系統(tǒng):http://python.usyiyi.cn/translate/django_182/topics/auth/default.html
Python 實(shí)戰(zhàn)班第16期火熱報(bào)名進(jìn)行中
招生要求:
想往開(kāi)發(fā)或者運(yùn)維開(kāi)發(fā)方向發(fā)展,Python 基礎(chǔ)為零或薄弱,但能讀懂 shell 或者其它任何一門語(yǔ)言的同學(xué)。
課程內(nèi)容:
◆精簡(jiǎn)版 CMDB
1、html+css+js 多種前端技術(shù)結(jié)合
2、ajax 異步請(qǐng)求操作
3、分頁(yè)搜索功能
4、常見(jiàn)數(shù)據(jù)庫(kù)設(shè)計(jì)原則、CMDB 表結(jié)構(gòu)實(shí)戰(zhàn)、Mysql 實(shí)操
5、獨(dú)立完項(xiàng)目、了解完整的 Web(LAMP) 架構(gòu)
◆Nginx 日志統(tǒng)計(jì)分析與多維可視化
1、用 Python 處理 Nginx 日志文件,進(jìn)行多維度數(shù)據(jù)統(tǒng)計(jì)分析
2、根據(jù) ip、訪問(wèn)地址和訪問(wèn)狀態(tài)等數(shù)據(jù)統(tǒng)計(jì),統(tǒng)計(jì)結(jié)果存入數(shù)據(jù)庫(kù)
3、Highcharts 等流行前端技術(shù)多維度,將分析結(jié)果可視化展示
◆快速構(gòu)建實(shí)用監(jiān)控系統(tǒng)
1、Python 讀取機(jī)器的實(shí)時(shí)使用數(shù)據(jù),通過(guò) Http 請(qǐng)求將數(shù)據(jù)入庫(kù)
2、設(shè)計(jì)數(shù)據(jù)入庫(kù)的 API,收集不同機(jī)器的數(shù)據(jù)
3、前端將內(nèi)存數(shù)據(jù)讀出,視化展示折線圖
4、獨(dú)立完成項(xiàng)目,掌握 Python 常用的 time 等模塊
咨詢報(bào)名聯(lián)系:
QQ(1):979950755 小月
QQ(2):279312229 ada
WeChat : 1902433859 小月
WeChat : 1251743084 小單
開(kāi)課時(shí)間:9月9日