rbac的權限組件 基於角色的權限控制數據庫
1.什麼是權限? django
url表明的就是一個權限json
2.如何實現權限的控制?session
表結構 以咱們講的課的內容爲例數據結構
菜單表: app
- title 標題url
- icon 圖標中間件
- weight 權重對象
權限表:字符串
- url 權限 這裏要用到正則匹配 不加^$
- title 權限標題 展現分配
- name URL別名 效果 : 把權限擴展到按鈕級別,就是我沒有這個權限,就沒有這個按鈕,並且要加上unique,保證權限惟一
- menu 外鍵 關聯到菜單表 Menu (1對多關係) 效果 : 選中默認展開
若是有menu_id, 說明是1級菜單下的2級菜單,若是沒有,說明是普通的權限
-parent 外鍵, 經過關聯到本身的id 屬於自關聯 , 效果 : 爲了解決(當你選中2級菜單下的添加或編輯下,左側菜單關閉,處於未選中狀態)的問題
若是有parent_id, 說明1級菜單下的普通權限,若是沒有,什麼都不是
若是既沒有menu_id,也沒用parent_id, 說明是普通權限,並且也沒有關聯2級菜單
角色表:
- name 角色名稱
- permission 外鍵 關聯到權限信息表 (多對多關係)
用戶表:
- user 用戶名
-pwd 密碼
-roles 外鍵,關聯角色表 (多對多關係)
技術點 :
- 中間件 -process_request
1.獲取當前的URL
request.current_menu_id=None
request.cbreadcurunb_list=[{'title': '首頁', 'url': ' /index/ ' }]
2.白名單
from django.conf import settings
settings.xxx #不把白名單寫死,下次修改直接才settings中修改便可
這裏須要用到re模塊,re.marth() # 從頭開始匹配,匹配到一個就返回
3.獲取登陸狀態
若是沒有登陸,redirect到login頁面
4.判斷是否是免認證的url
5.進行權限的校驗
首先先獲取到本用戶的權限信息,咱們以前將用戶的權限信息保存到了session中,因此這裏咱們要獲取須要從session中獲取.
permision_dict = request.session[settings.xxx]
.get到id ,pid ,pname
判斷有沒有pid ,若是有,說明是子權限
request.current_menu_id=pid
若是沒有pid.說明是父權限.
request.current_menu_id=id
request.cbreadcrumb_list.append({url:i[ url ], title : i [ title ] } )
6.return Httpresponse('沒有權限')
- 登陸
1.認證 經過ORM操做去數據庫中校驗用戶名密碼是否正確
2.認證成功後進行權限信息的初始化操做, init_permission(request,obj)
- 獲取當前用戶的權限信息
ORM
values()
permission__title 跨表操做
過濾權限爲空的權限, filter(permissions__url__isnull=False)
去重 distinct()
- 構建權限和菜單數據結構
權限的數據結構
簡單的控制 permission_list = [{ url : persission__url }]
非菜單權限歸屬 permission_list=[ url , pid , id ]
路徑導航 permission_dict={ id : url , id , pid , title }
最終版 permission_dict = {name : {url , id, pid, title ,pname}}
菜單的數據結構
menu_list = [ {url , title , icon }]
menu_dict = {
一級菜單的id :{ title , icon , weight children :{ url , title , id }} }
- 保存權限和菜單的信息到session中
json序列化 數字當作字典的key 會變成字符串
settings
-模板
動態生成菜單
-inclusion_tag 自定義標籤 返回一個HTML代碼段
- 有序字典 OrderDict()
- sorted(可迭代對象,key=lamda x : x[xxx], reverse=True)
- 兩次for循環
路徑導航
- inclusion_tag
權限控制到按鈕級別