亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2018年10月30日 09:00:53   作者:Darcy''s Blog  
這篇文章主要介紹了使用django-guardian實現django-admin的行級權限控制的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

需求描述

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

解決方案

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

關鍵步驟

安裝配置django-guardian

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

把django-guardian整合到django-admin

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

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

from guardian.admin import GuardedModelAdmin
from 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

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

總結

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Pytorch提取模型特征向量保存至csv的例子

    Pytorch提取模型特征向量保存至csv的例子

    今天小編就為大家分享一篇Pytorch提取模型特征向量保存至csv的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Flask 上傳自定義頭像的實例詳解

    Flask 上傳自定義頭像的實例詳解

    今天小編就為大家分享一篇Flask 上傳自定義頭像的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 對Python多線程讀寫文件加鎖的實例詳解

    對Python多線程讀寫文件加鎖的實例詳解

    今天小編就為大家分享一篇對Python多線程讀寫文件加鎖的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python裝飾器練習題及答案

    python裝飾器練習題及答案

    這篇文章主要介紹了python裝飾器練習題及答案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 如何修改Jupyter工作路徑(已安裝Anaconda)

    如何修改Jupyter工作路徑(已安裝Anaconda)

    這篇文章主要介紹了如何修改Jupyter工作路徑問題(已安裝Anaconda),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python編寫分類決策樹的代碼

    python編寫分類決策樹的代碼

    這篇文章主要為大家詳細介紹了python編寫分類決策樹的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Python實現的txt文件去重功能示例

    Python實現的txt文件去重功能示例

    這篇文章主要介紹了Python實現的txt文件去重功能,涉及Python針對txt文本文件的讀寫、字符串遍歷、判斷相關操作技巧,需要的朋友可以參考下
    2018-07-07
  • Django框架模板用法入門教程

    Django框架模板用法入門教程

    這篇文章主要介紹了Django框架模板用法,結合簡單入門實例形式分析了Django框架模板標簽、過濾器、模板繼承等概念與使用技巧,需要的朋友可以參考下
    2019-11-11
  • Python傳統(tǒng)圖像處理之皮膚區(qū)域檢測詳解

    Python傳統(tǒng)圖像處理之皮膚區(qū)域檢測詳解

    這篇文章主要介紹了在不同情景下對傳統(tǒng)圖像進行皮膚區(qū)域檢測,文章中的代碼具有一定的參考價值,感興趣的小伙伴可以跟隨小編一起來學習學習
    2021-12-12
  • Python腳本/代碼的幾種常見運行方式

    Python腳本/代碼的幾種常見運行方式

    我們知道,python腳本或者說python程序其實是一個包含了python代碼的文件,通過運行python代碼,我們可以驗證腳本/程序是否按照我們的期望執(zhí)行,在python中,有多種方式來運行腳本或程序,取決于小伙伴們的需求,接下來小編將介紹幾種常見的 python 代碼運行方式
    2023-10-10

最新評論