[Python學習] Django 權限控制
本文為大家講解 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 的實例,我們無法為它創建/分配權限
權限應用
Permission
User Permission
Group Permission
權限檢查
◆ 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
本文出自 “Python & Golang 學習” 博客,轉載請與作者聯系!
[Python學習] Django 權限控制