亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

使用django-guardian實現django-admin的行級權限控制的方法

2020-02-15 23:28:50
字體:
來源:轉載
供稿:網友

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

需求描述

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

解決方案

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

關鍵步驟

安裝配置django-guardian

安裝配置django-guardian比較簡單,按照她項目提供的 文檔 進行安裝就可以了,安裝完成后會在數據庫里面創建兩張權限相關的表。

把django-guardian整合到django-admin

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

配置完權限的時候,用一個新的用戶測試的話,會發現該用戶沒有權限來訪問任何的數據,這是因為GuardedModelAdmin還有很多事情沒有幫我們做,我們還需要重寫一些函數來實現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是否在主頁面中顯示的話由該函數決定  def has_module_permission(self, request):    if super().has_module_permission(request):      return True    return self.get_model_objs(request).exists()  # 在顯示數據列表額時候,哪些數據顯示,哪些不顯示,由該函數控制  def get_queryset(self, request):    if request.user.is_superuser:      return super().get_queryset(request)    data = self.get_model_objs(request)    return data      # 內部用來獲取某個用戶有權限訪問的數據行  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)  # 用來判斷某個用戶是否有某個數據行的權限  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()  # 是否有查看某個數據行的權限  def has_view_permission(self, request, obj=None):    return self.has_perm(request, obj, 'view')  # 是否有修改某個數據行的權限  def has_change_permission(self, request, obj=None):    return self.has_perm(request, obj, 'change')  # 是否有刪除某個數據行的權限  def has_delete_permission(self, request, obj=None):    return self.has_perm(request, obj, 'delete')  # 用戶應該擁有他新增的數據行的所有權限  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            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲成视频免费观看| 自拍偷拍免费精品| 国产精品久久久久久久久免费看| 欧美色道久久88综合亚洲精品| 91国内精品久久| 国产精品高潮粉嫩av| 亚洲精品一区二区三区婷婷月| 隔壁老王国产在线精品| 日韩欧美精品网站| 亚洲xxxx3d| 欧美视频在线免费| 福利一区福利二区微拍刺激| 国产精品自拍偷拍| www.美女亚洲精品| 日日狠狠久久偷偷四色综合免费| 日韩精品久久久久久久玫瑰园| 欧美大片免费观看在线观看网站推荐| xvideos成人免费中文版| 尤物精品国产第一福利三区| 欧美精品videofree1080p| 日韩欧美中文在线| 欧美日韩不卡合集视频| 亚洲电影免费观看高清完整版在线| 欧美性猛交xxxx乱大交| 久久九九全国免费精品观看| 亚洲美女又黄又爽在线观看| 91久久精品久久国产性色也91| 国产精品欧美亚洲777777| 日韩在线观看网站| 97精品国产aⅴ7777| 国产婷婷色综合av蜜臀av| 欧美亚洲视频在线观看| 国产精品h片在线播放| 日韩天堂在线视频| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲欧美另类中文字幕| 国产精品久久91| 国产精品亚洲精品| 成人在线精品视频| 国产精品久久999| 国产精品精品久久久| 欧美一区二粉嫩精品国产一线天| 国产成人精品a视频一区www| 亚洲欧美中文字幕| 日韩av电影手机在线| 人人做人人澡人人爽欧美| 精品久久国产精品| 亚洲va久久久噜噜噜| 欧美中文在线观看国产| 亚洲第一综合天堂另类专| 精品久久久久久国产91| 美女啪啪无遮挡免费久久网站| 91超碰caoporn97人人| 91国在线精品国内播放| 亚洲精品在线91| 国产欧美一区二区三区四区| 亚洲成人免费在线视频| 亚洲国产精品va在线| 国产精品羞羞答答| 高潮白浆女日韩av免费看| 欧美午夜女人视频在线| 欧美美女操人视频| 国产精品美女在线| 91视频免费网站| 麻豆国产va免费精品高清在线| 日本成人在线视频网址| 狠狠色狠狠色综合日日五| 中文字幕一区二区三区电影| www.亚洲成人| 欧美另类第一页| 欧美国产乱视频| 国产91精品不卡视频| 在线播放日韩专区| 欧美成年人视频网站| 777午夜精品福利在线观看| 午夜精品久久久久久久久久久久久| 国产午夜精品久久久| 日韩在线不卡视频| 91精品国产高清自在线看超| 亚洲欧美国产日韩中文字幕| 美日韩精品免费观看视频| 伊人伊人伊人久久| 国模私拍视频一区| 国产精品视频区| 国产精品久久久久久久9999| 久久久免费在线观看| 色琪琪综合男人的天堂aⅴ视频| 91久久中文字幕| 91国产一区在线| 91久久久久久| 亚洲国产精品福利| 在线午夜精品自拍| 欧美电影在线免费观看网站| 亚洲高清久久网| 国产精品久久久一区| 久久久久久久久久久成人| 国产一区二区三区欧美| 国产精品福利无圣光在线一区| 欧美性感美女h网站在线观看免费| www.久久久久| 欧美激情xxxxx| 亚洲成人1234| 国产日韩综合一区二区性色av| 亚洲a在线播放| 有码中文亚洲精品| 亚洲美女喷白浆| 久久久久中文字幕2018| 亚洲国产精品悠悠久久琪琪| 欧美日韩免费在线| 欧美午夜丰满在线18影院| 俺去了亚洲欧美日韩| 亚洲国产精品推荐| 欧美激情影音先锋| 国产成人福利视频| 国产午夜精品全部视频在线播放| 国产精品www| 91网站免费观看| 欧美视频不卡中文| 久久成人国产精品| 久久视频在线视频| 亚洲色图17p| 日韩精品视频在线观看网址| 97婷婷大伊香蕉精品视频| 成人av资源在线播放| 久久天天躁狠狠躁夜夜躁2014| 亚洲视频自拍偷拍| 国产日韩av在线播放| 国产噜噜噜噜噜久久久久久久久| 久久久亚洲国产天美传媒修理工| 亚洲男人天堂手机在线| 欧美成人一区在线| 久久久精品在线观看| 亚洲精品美女在线观看| 91wwwcom在线观看| 国产日韩在线看片| 欧美激情视频给我| 97在线观看视频| 欧美日韩亚洲精品一区二区三区| 精品女同一区二区三区在线播放| 伊是香蕉大人久久| 欧美日韩加勒比精品一区| 国产亚洲美女久久| 亚洲欧美国产另类| 国产精品香蕉av| 国产成人在线精品| 国产精品久久久久久久久影视| 亚洲第一国产精品| 国产欧美日韩精品专区| 欧美一级免费视频| 久久黄色av网站| 日本久久久久久| 亚洲成人激情视频| 欧美激情视频一区二区三区不卡| 久久久亚洲影院| 日本高清+成人网在线观看| 国产精品偷伦免费视频观看的| 久久久久久久久国产| 久久久亚洲影院| 久久久久久久电影一区| 日韩av免费观影| 91免费视频国产| 久久久视频精品| 97香蕉超级碰碰久久免费的优势| 国产精品日韩久久久久|