權限部分

 

crm 部分

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
相關文章
相關標籤/搜索