国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

使用django-guardian實現(xiàn)django-admin的行級權(quán)限控制的方法

2020-01-04 14:11:29
字體:
供稿:網(wǎng)友

用django框架來做一些后臺管理的web頁面簡直太方便了,django自帶模塊級的權(quán)限系統(tǒng),用來做一些內(nèi)部的系統(tǒng)非常合適,可以大大的減少開發(fā)量。但是django自帶的權(quán)限系統(tǒng)還不支持行級的權(quán)限控制,如果要實現(xiàn)行級的權(quán)限控制,需要依賴第三方的app來開發(fā),或者自己重新寫一個。

需求描述

我們項目組開發(fā)的一些系統(tǒng)通常會用mysql數(shù)據(jù)庫來存儲一些配置,但是如果每次有配置修改的時候都去手動修改mysql數(shù)據(jù)的話,會挺麻煩的,同時也比較容易出錯。django-admin能夠根據(jù)定義的model自動的生成相應(yīng)的頁面,同時還能提供權(quán)限的管理,所以我們就把一些系統(tǒng)到的配置放到django中。但是到現(xiàn)在,隨著系統(tǒng)的需求越來越多,該系統(tǒng)已經(jīng)不止我們自己項目組的人員使用,也要開放給其他項目組的同事使用,所以就產(chǎn)生了一些更細粒度的權(quán)限需求。因此,我們要在現(xiàn)有的系統(tǒng)上支持行級的權(quán)限控制。

解決方案

當(dāng)然可以自己寫一套權(quán)限系統(tǒng)了,但是自己寫的成本比較高,而且自己寫的不一定比較好。所以我就先在網(wǎng)上找了一些現(xiàn)成的解決方案, https://djangopackages.org/grids/g/perms/ 該鏈接列出了現(xiàn)有的一些第三方的權(quán)限系統(tǒng)解決方案。從該頁面來看,django-guardian是最受歡迎的第三方權(quán)限系統(tǒng),而且支持行級的權(quán)限系統(tǒng),同時還可以整合到django-admin里面,所以我就選擇了django-guardian。

關(guān)鍵步驟

安裝配置django-guardian

安裝配置django-guardian比較簡單,按照她項目提供的 文檔 進行安裝就可以了,安裝完成后會在數(shù)據(jù)庫里面創(chuàng)建兩張權(quán)限相關(guān)的表。

把django-guardian整合到django-admin

首先把admin.py文件里面需要用到行級權(quán)限的類,由原來的繼承admin.ModelAdmin,改成繼承GuardedModelAdmin,這時候打開某個數(shù)據(jù)行的頁面的時候,在該頁面的右上角的歷史旁邊會顯示編輯對象權(quán)限的按鈕,點擊該按鈕進去相應(yīng)的頁面就可以編輯該行數(shù)據(jù)的具體權(quán)限。

配置完權(quán)限的時候,用一個新的用戶測試的話,會發(fā)現(xiàn)該用戶沒有權(quán)限來訪問任何的數(shù)據(jù),這是因為GuardedModelAdmin還有很多事情沒有幫我們做,我們還需要重寫一些函數(shù)來實現(xiàn)admin后臺頁面的顯示。具體的信息看下面的代碼注釋。

from guardian.admin import GuardedModelAdminfrom guardian.shortcuts import get_objects_for_user, assign_perm, remove_perm, get_users_with_perms, /  get_groups_with_perms  # 需改前@admin.register(DataAssistantJob)class DataAssistantJobAdmin(admin.ModelAdmin):  pass# 修改后@admin.register(DataAssistantJob)class DataAssistantJobAdmin(GuardedModelAdmin):  # app是否在主頁面中顯示的話由該函數(shù)決定  def has_module_permission(self, request):    if super().has_module_permission(request):      return True    return self.get_model_objs(request).exists()  # 在顯示數(shù)據(jù)列表額時候,哪些數(shù)據(jù)顯示,哪些不顯示,由該函數(shù)控制  def get_queryset(self, request):    if request.user.is_superuser:      return super().get_queryset(request)    data = self.get_model_objs(request)    return data      # 內(nèi)部用來獲取某個用戶有權(quán)限訪問的數(shù)據(jù)行  def get_model_objs(self, request, action=None, klass=None):    opts = self.opts    actions = [action] if action else ['view', 'change', 'delete']    klass = klass if klass else opts.model    model_name = klass._meta.model_name    return get_objects_for_user(user=request.user, perms=[f'{perm}_{model_name}' for perm in actions],                  klass=klass, any_perm=True)  # 用來判斷某個用戶是否有某個數(shù)據(jù)行的權(quán)限  def has_perm(self, request, obj, action):    opts = self.opts    codename = f'{action}_{opts.model_name}'    if obj:      return request.user.has_perm(f'{opts.app_label}.{codename}', obj)    else:      return self.get_model_objs(request, action).exists()  # 是否有查看某個數(shù)據(jù)行的權(quán)限  def has_view_permission(self, request, obj=None):    return self.has_perm(request, obj, 'view')  # 是否有修改某個數(shù)據(jù)行的權(quán)限  def has_change_permission(self, request, obj=None):    return self.has_perm(request, obj, 'change')  # 是否有刪除某個數(shù)據(jù)行的權(quán)限  def has_delete_permission(self, request, obj=None):    return self.has_perm(request, obj, 'delete')  # 用戶應(yīng)該擁有他新增的數(shù)據(jù)行的所有權(quán)限  def save_model(self, request, obj, form, change):    result = super().save_model(request, obj, form, change)    if not request.user.is_superuser and not change:      opts = self.opts      actions = ['view', 'add', 'change', 'delete']      [assign_perm(f'{opts.app_label}.{action}_{opts.model_name}', request.user, obj) for action in actions]    return result

通過上面的修改,django-admin中的模塊就能夠支持行級的權(quán)限,并能夠正確的在后臺頁面中顯示出來,當(dāng)然如果有很多的模塊需要支持行級的權(quán)限控制,則可以把上面的這些修改寫到一個新的類中,然后其他想支持行級權(quán)限的模塊再從該模塊繼承就可以了。

總結(jié)

感覺django-guardian和django-admin整合,實現(xiàn)的不是很好。如果開發(fā)者對django內(nèi)部的代碼不怎么了解,那么用django-guardian來實現(xiàn)行級權(quán)限控制的話會挺麻煩的,個人認為django-guardian完全可以把和django-admin的整合做到開箱即用的效果,就像django自帶的權(quán)限系統(tǒng)一樣。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 佛山市| 清原| 碌曲县| 吕梁市| 鱼台县| 马边| 南康市| 安宁市| 依安县| 陆川县| 普洱| 砀山县| 连平县| 固镇县| 城市| 乌恰县| 台山市| 五家渠市| 师宗县| 建湖县| 河北省| 富民县| 登封市| 陇南市| 军事| 鸡东县| 三门县| 绥芬河市| 岑溪市| 龙川县| 铜山县| 玉环县| 额尔古纳市| 锦屏县| 九寨沟县| 武汉市| 株洲市| 丰城市| 虹口区| 敖汉旗| 德兴市|