Django-auth組件
1 表結構
我們從python manage.py migrate
為我們創建的auth
組件內置的表開始看
-
auth_user
:用戶表存儲用戶信息(登錄admin后臺)里面的字段分兩類:用戶基本信息(用戶名,郵箱,密碼等)和2張M2M表(用戶+權限,用戶+組)(與權限相關)
-
auth_permission
:權限表,存儲所有表生成的增刪改查的URL(每張表4個路由<——>路由的別名) -
auth_user_user_permissions
:用戶表和權限表的多對多關系表,里面放user_id
和permission_id
-
auth_group
:組表,里面放id和組名,和權限表有多對多的關系(對權限進行分組) -
auth_user_groups
:用戶表和組表的關系表,給用戶分組 -
auth_group_permissions
: 組表和權限表的關系表,給權限分組
2 登錄路由
當我們執行python manage.py createsuperuser
時,會創建超級用戶
我們從超級用戶的登錄路由來看
源碼嵌套比較多(要重復看),重點在重用和解耦,可實現比較多的自定義
3 首頁權限分配
當用戶登錄成功后,展示的是基于admin注冊的表,其中
-
超級用戶全部可見
-
其他用戶,只要增刪改查4個權限有一個權限被分配,就可以看見
我們來看auth源碼中是如何控制這種權限的分配
從前面的路由分析中,當我們通過登錄成功后,就是執行self.index
來展示首頁的信息
總結:
- 獲取所有通過admin注冊的Model
- 根據當前的request.user去數據庫校驗,判斷是否展示
4 按鈕控制
auth組件中我們可以控制是否展示add、delete等按鈕
上文的分析圖中我們可以得到app_list
中包含的是獲取的具體權限信息
app_list:
[{"name": "App01","app_label": "app01","app_url": "/admin/app01/","has_module_perms": true,"models": [{"model": "<class 'app01.models.Depart'>","name": "Departs","object_name": "Depart","perms": {"add": false,"change": false,"delete": false,"view": true},"admin_url": "/admin/app01/depart/","add_url": "None","view_only": true}]},{"name": "Authentication and Authorization","app_label": "auth","app_url": "/admin/auth/","has_module_perms": true,"models": [{"model": "<class 'django.contrib.auth.models.Group'>","name": "Groups","object_name": "Group","perms": {"add": true,"change": true,"delete": true,"view": true},"admin_url": "/admin/auth/group/","add_url": "/admin/auth/group/add/","view_only": false}]}
]
我們可以通過每個app下每張表的權限true/false來判斷是否有權限
具體判斷則在每張表的HTML模板中