[ Python 學習] Django 權限控制

本文為大傢講解 Django 框架裡自帶的權限模型,從理論到實戰演練,帶領大傢瞭解 Django 裡權限是怎麼一回事。


一、主要內容

1 什麼是權限管理?

2 Web 權限

3 Django 權限機制

4 Django 的權限項

5 權限應用

Permission(一)

Permission(二)

User Permission 管理(一)

User Permission 管理(二)

Group Permission 管理

權限驗證(一)

權限驗證(二)

權限驗證(三)

權限驗證(四)


二、什麼是權限管理

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

三、Web 權限

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

四、Django 權限機制

1 Django 權限機制能夠約束用戶行為,控制頁面的顯示內容,也能使 API 更加安全和靈活;用好權限機制,能讓系統更加強大和健壯
2 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 的權限項

1 Django 用 permission 對象存儲權限項,每個 model 默認都有三個 permission,即 add model, change model 和 delete model
2 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_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):
……

◆ 權限驗證(三)

views 中驗證
if not request.user.has_perm(’ dashboard.view_server')
return HttpResponse('Forbidden')

◆ 權限驗證(四)

Template 中的權限檢查
{% if perms.dashboard.view_server %}
有權限
{% endif %}

◆ 擴展閱讀:

使用 Django 認證系統: http://python.usyiyi.cn/translate/django_182/topics/auth/default.html

原文閱讀鏈接:
http://mp.weixin.qq.com/s/DOLrxpcaGzTq6CPpkYjr5g
已邀請:

蛤蟆三代

贊同來自:

我想問下,如果對業務操作進行權限管理,這個 django 應該怎麼做?例如,我想控制一些信息對不同的組顯示不同。這個並沒有對應的 model。但我又不想寫死在代碼裡面。因為很多場景會用到類似的處理

@yinzishao17 1 首先需要前端控制,通過前端代碼控制,沒權限不顯示功能。
2 無權限發現沒有 idc 管理按鈕

重生之第一秘書

贊同來自:

@yinzishao17
權限控制分多個方面,1. 前端:首先需要前端控制,通過前端代碼作 if 判斷,沒權限不顯示功能。
2. 後端:需要通過用戶組獲取對應的不同權限。
如下:In [1]: from django.contrib.auth.models import Permission, Group

In [2]: g = Group.objects.get(name="devops")
In [17]: p = Permission.objects.get(pk=26)

In [18]: g.permissions.add(p) #添加權限序號為 26 的權限給用戶組 devops#
通過前後端驗證才能實現權限的控制

要回復問題請先登錄註冊