標籤:

[Python學習] Django 許可權控制

[Python學習] Django 許可權控制

4 人贊了文章

本文為大家講解 Django 框架里自帶的許可權模型,從理論到實戰演練,帶領大家了解 Django 里許可權是怎麼一回事。

主要內容

什麼是許可權管理?

Web 許可權

Django 許可權機制

Django 的許可權項

許可權應用

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

什麼是許可權管理

  • 許可權管理,一般指根據系統設置的安全規則或者安全策略,用戶可以訪問而且只能訪問自己被授權的資源
  • 許可權管理好比如鑰匙,有了鑰匙就能把門打開,但是許可權設置是有級別之分的,假如這個系統有多個許可權級別就如一間屋有多個門,想要把所有門都打開您必須要取得所有的鑰匙匙,就如系統一樣。

Web 許可權

在 Web 里許可權管理是 Web 應用項目中比較關鍵的環節,因為瀏覽器是每一台計算機都已具備的,如果不建立許可權管理系統,那麼一個「非法用戶」可以輕而易舉通過瀏覽器訪問Web應用項目中的所有功能。因此需要許可權管理系統進行許可權檢測,讓經過授權的用戶可以正常合法的使用已授權的功能,而對那些未授權的非法用戶拒之門外。 一個好的許可權管理系統應該對每一類或每一個用戶,分配不同的系統操作許可權,並應具有擴展性,也就是它可以加入到任何一個帶有許可權管理的 Web 應用項目中,就像構件一樣可以被重複使用。 同時,還要提醒開發者,開發一個 Web 應用項目時,應儘可能的將整個系統細化,分解為若干個子模塊,最後組合成一個完整的應用。也只有這樣,才容易實現為每一類或每一個用戶分配不同的操作許可權。

Django 許可權機制

  • Django 許可權機制能夠約束用戶行為,控制頁面的顯示內容,也能使 API 更加安全和靈活;用好許可權機制,能讓系統更加強大和健壯
  • Django 用 user, group 和 permission 完成了許可權機制,這個許可權機制是將屬於 model 的某個 permission 賦予 user 或 group,可以理解為全局的許可權,即如果用戶A對數據模型(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 的實例,我們無法為它創建/分配許可權

許可權應用

  1. Permission
  2. User Permission
  3. Group Permission
  4. 許可權檢查

◆ 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() 方法的參數,即 permission 的 codename,但傳遞參數時需要加上 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
  • 當業務邏輯中涉及到許可權檢查時,decorator 能夠分離許可權驗證和核心的業務邏輯,使代碼更簡潔,邏輯更清晰。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_decoratorfrom django.contrib.auth.decorators import login_required, permission_requiredclass 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 認證系統:python.usyiyi.cn/transl


推薦閱讀:

python程序執行原理-python面試題 171119
利用python進行時間序列分析——從隨機遊走到GARCH模型(一)
慶祝法國隊奪冠:用Python放一場煙花秀
你女朋友生你氣是因為你還沒學深度學習
利用try,except,else,finally給出成績等級

TAG:Python | 自動化 |