day72 關於rbac組件的小部分面試題

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

    權限控制到按鈕級別

相關文章
相關標籤/搜索