1. 權限基本流程web
#用戶登陸成功後獲取權限信息,將【權限和菜單】信息寫入到session。 #之後用戶在來訪問,在中間件中進行權限校驗。 #爲了提高用戶體驗友好度,在後臺經過inclusion_tag動態生成一個二級菜單。
2. 使用權限數據庫
#- 用戶登錄:權限和菜單的初始化; init_permission #- 配置中間件 #- 配置白名單 #- 配置session中使用到的key #- load rbac #- menu ,inclusion_tag 生成菜單 #- filter,能夠在if後作條件,粒度控制到按鈕。
1、問題:django
1. 爲何程序須要權限控制?session
2. 爲何要開發權限組件? 數據結構
3. web開發中權限指的是什麼?app
#一個權限 約等於 URL
2、設計權限系統表結構函數
初版設計:url
#用戶表: #ID Name #權限表: #ID Url #用戶權限關係表: #ID 用戶ID 權限ID
第二版設計,基於角色的權限控制 rbac (role based access control)spa
#用戶表: #ID Name #角色表 #ID title #用戶角色關係表:#ID 用戶ID 角色ID #權限表: #ID Url
#角色權限關係表:#ID 角色ID 權限ID
8. 如何在其餘系統中應用目前的rbac組件。 #a. 拷貝rbac組件 #b. 清空migrations目錄 #c. 註冊rbac 到app d. 數據庫遷移並錄入權限信息 #e. 用戶登錄作權限和菜單的初始化 init_permission #f. 應用中間件進行權限校驗 #g. 設置配置文件 #h. 顯示動態菜單 #j. 粒度控制到按鈕
1. 權限有幾張表?設計
2. 簡述權限流程?
3. 爲何要把權限放入session?
4. 靜態文件和模塊文件
5. 相關技術點
#- orm查詢 #- 去空 #- 去重 #- 中間件 #- inclusion_tag #- 引入靜態文件 #{% load staticfiles %} #{% static '....' %}
6. 二級菜單時,如何構造的數據結構?
menu_dict = { 1:{ title:'信息管理', icon:'fa-coffee', class:'', children:[ {title:'客戶列表',url:'/customer/list/','class':'active'}, ] }, }
11. 問題: 非菜單的權限歸屬?
12. 問題:層級導航?
13. 粒度控制到按鈕?
14. 階段總結
1. 如何實現的權限系統?
#粒度控制到按鈕級別的權限控制 #- 用戶登錄成功以後,將權限和菜單信息放入session #- 每次請求時,在中間件中作權限校驗 #- inclusion_tag實現的動態菜單
2. 如何實現控制到按鈕的呢?
#用戶登錄時,用戶所擁有的權限 別名==django 路由name 構形成一個字典; #在頁面中寫了一個 django模板的filter來進行判斷是否顯示;
3. 爲何要在中間件中作校驗呢?
#全部請求在到達視圖函數以前,必須通過中間件,因此在中間件中對請求作處理比較簡單;
4. 模板中的特殊方法:
#inclusion_tag、simpletag、filter
5. 權限中使用了幾張表?
#六張,必需要說出來
6. 表中的字段?(背表)
7. 寫流程(思惟導讀)
8. 如何實現粒度到數據行?
#添加一條更細粒度的表,作條件用;
9. 修改權限以後,如想應用最新權限
#- 咱們:須要從新登錄。 #- 不用從新登錄,如何完成?更新涉及的全部用戶的session信息
10. 最重要 *****
#- 瞭解權限系統的流程和實現(一行一行過,根據表結構本身寫) 不要抄 #- 權限組件的應用
1. 簡述權限管理的實現原理。
2. 表結構
3. 知識點
#- 中間件白名單:配置文件、中間件return None #- 權限初始化: #- left join #- 特殊字典的構造 權限 = { 權限別名:{id:'',title:'',url,pid:''}, 權限別名:{id:'',title:'',url,pid:''}, 權限別名:{id:'',title:'',url,pid:''}, } 菜單 = { 菜單ID:{ title:'', icon:'', children:[ {id:'1',.....} ] } } #- key爲數字的字典,在序列化時會變成字符串(*) #- 配置文件 #- 中間件進行權限校驗 #- 權限校驗 #- 導航路徑 #- pid,訪問沒法成爲菜單的權限時,默認展開的父級權限ID #- 動態生成菜單 #- 經過inclusion_tag和兩層for循環 + 中間件傳來的pid #- 粒度控制到按鈕 #- 基於filter並經過 別名 進行權限的判斷; #session #orm - 去重 - 去空 #inclusion_tag #filter #有序字典 #settings配置 #引入靜態文件 #url別名 #namespace #路由分發 #構造數據結構 #ModelForm #組件應用 #admin #icon爬蟲 #mark_safe #下載文件
1. 構造權限結構
def role_test(request): # 問題:從數據庫中獲取全部的權限 """ { 1:{ 'title':'帳單列表', 'url':'/payment/list/', 'name':'payment_list', children:[ {'title':'刪除帳單','url':'/payment/list/','name':'payment_list'}, {'title':'編輯帳單','url':'/payment/list/','name':'payment_list'}, {'title':'添加帳單','url':'/payment/list/','name':'payment_list'}, ] }, 2:{ 'title':'客戶列表', 'url':'/payment/list/', 'name':'payment_list', children:[ {'title':'下載客戶模板','url':'/payment/list/','name':'payment_list'}, {'title':'下載客戶模板','url':'/payment/list/','name':'payment_list'}, {'title':'下載客戶模板','url':'/payment/list/','name':'payment_list'}, ] } } """
2. 批量操做權限
#集合交集和差集 #批量操做:form_set
1. 構造父子結構
2. 構造家族結構
comment_list = [ {'id':1, 'title':'寫的不錯', 'pid':None} {'id':2, 'title':'還不錯', 'pid':None} {'id':3, 'title':'什麼萬一', 'pid':1} {'id':4, 'title':'什麼不錯', 'pid':2} {'id':5, 'title':'x1', 'pid':1}, {'id':6, 'title':'去你的吧', 'pid':3}, {'id':7, 'title':'去你的吧', 'pid':6}, ] comment_list = [ {'id':1, 'title':'寫的不錯', 'pid':None}, # ,children:[] {'id':2, 'title':'還不錯', 'pid':None}, {'id':3, 'title':'什麼萬一', 'pid':1}, {'id':4, 'title':'什麼不錯', 'pid':2}, {'id':5, 'title':'x1', 'pid':1}, {'id':6, 'title':'去你的吧', 'pid':3}, {'id':7, 'title':'去你的吧', 'pid':6}, ]
3. formset
#批量表單處理
4. ModelForm也有鉤子函數
#注意:若是想要主動顯示錯誤信息,能夠使用 add_error('字段','錯誤信息')
5. FK
class Permission(models.Model): """ 權限表 """ title = models.CharField(verbose_name='標題', max_length=32) url = models.CharField(verbose_name='含正則的URL', max_length=128) name = models.CharField(verbose_name='URL別名',max_length=32,null=True,blank=True) parent = models.ForeignKey(verbose_name='父權限',to='Permission',null=True,blank=True, limit_choices_to={'parent__isnull':True}) menu = models.ForeignKey(verbose_name='菜單',to='Menu',null=True,blank=True)
6. 獲取當前項目中全部的URL
7. name
#URL別名: namespace:name #URL別名: name