rbac

動態生成一級菜單:css

model裏修改字段爲html

在登陸查詢用戶時,將四個字段的信息都查詢出來前端

並根據用戶可以訪問的網頁權限和顯示的菜單 blank表示頁面輸入能夠爲空 null=true 表示數據表能夠爲空python

分爲權限列表和菜單列表web

permission_list數據庫

menu_listsession

權限信息用來驗證用戶可以訪問的頁面數據結構

菜單列表用來顯示用戶能夠訪問的頁面app

頁面能夠接受requestide

request.session.menu來獲得ur,title,icon顯示在頁面上能夠用for循環實現

一級菜單優化

在頁面request.session.menu是寫死了

建立templatetags包

裏面my_tags.py

經過sample.inclusion.tags方法

寫一個menu函數,再建立一個menu頁面menu.html

裏面講request.session.menu內容複製進去

再在原頁面寫{%load my_tags%}

{%menu request%}導入

給訪問的菜單加active屬性

在menu函數裏

由於知道要訪問的頁面url request.path_info

循環菜單列表時

若是這個菜單的url和訪問頁面相同時 用正則進行判斷 re.match(item[url],request.path_info):

裏面 item['class']=active加入active屬性

在頁面用menu.class顯示

rbac功能整合

功能整合就是將rbac的全部函數,頁面,css都拖到本身的rbac的app裏,使rbac獨立起來能夠隨時調用

應用rbac組件的流程

1.將rbac app直接拷貝進來

  在settings裏註冊rbac app

2 數據庫的遷移

  1刪除rbac下migrations下除init外的其餘py文件

  2執行命令

3 錄入權限信息 ,經過Django自帶的admin頁面

  1.首先建立超級用戶

    python manage.py createsuperuser

  2.登陸admin

    1.經過rbac裏已經寫完的角色,權限,用戶信息

      錄入權限信息 角色信息 用戶信息

    2.分配對應的關係

4.登錄成功後調用權限初始化的函數permission

  經過permission將用的權限信息放入權限列表 菜單信息放入菜單列表

  from rbac.service.permission import init_permission

  init_permission(request,obj)  # 傳入request和obj

5.在settings裏註冊權限的中間件

  MIDDLEWARE = [
        'rbac.middlewares.rbac.RbacMidlleware'   
]

  經過rbac的request進行權限的驗證

並將權限相關的配置寫入settings裏

# 權限存放在session中的KEY

PERMISSION_SESSION_KEY = 'permission'

# 菜單存放在session中的KEY

MENU_SESSION_KEY = 'menu'

# 白名單

WHITE_LIST = [     r'^/login/$',    

r'^/reg/$',    

r'^/admin/.*', ]

6.將動態菜單加入到頁面中應用到inclusion_tag

  {% load rbac %}
  {% menu request %}

  在頁面裏要導入菜單的靜態文件

  1.menu.css

有一個母版頁面,經過這個母版進行加入

 二級菜單

  如何創建一個二級菜單

  首先須要先創建菜單表

  菜單表只放入一級菜單的信息 name icon圖標

  權限表添加menu字段用於關聯菜單表

  並將菜單信息表的數據結構進行修改

  自定義inclusion.tag須要修改

  實現點擊一級菜單隱藏顯示二級菜單功能

  使用js功能

二級菜單默認展開並選中+一次菜單排序

經過js方法能夠實現給二級菜單加active屬性

但爲了實現訪問的頁面所屬的菜單可以展開,其餘菜單閉合

在permssion裏

利用建立一個querydict,菜單列表循環給全部一級菜單加入hide屬性

當訪問的二級菜單屬於一級菜單時,將一級菜單的hide屬性去掉,並給訪問的二級菜單加active屬性

實現一次菜單排序,須要給model裏的menu表加入一個weight屬性

每次登錄時查詢用戶的weight屬性

並經過sort函數根據weight屬性進行排序

將排序完的列表在根據上面的二級菜單加屬性的流程走

經過inclusion.tag並在頁面中展現

路徑導航 

首先創建麪包屑列表 request.breadcrumb_list =[

{'title': '首頁', 'url': '/index/'}

]

在權限的校驗中,若是是子權限訪問的是三級菜單

先將二級菜單加入麪包屑列表

request.breadcrumb_list.append( {'title': permission_dict[str(pid)]['title'], 'url': permission_dict[str(pid)]['url']})

 再將訪問的頁面加入麪包屑列表

request.breadcrumb_list.append({'title': item['title'], 'url': item['url']})

建立inclusion_tag

@register.inclusion_tag('breadcrumb.html')

def breadcrumb(request):

  return {'breadcrumb_list': request.breadcrumb_list}

breadcrumb.html

<div>
    <ol class="breadcrumb no-radius no-margin" style="border-bottom: 1px solid #ddd;">

        {% for breadcrumb in breadcrumb_list %}
            {% if forloop.last %}
                <li class="active">{{ breadcrumb.title }}</li>
            {% else %}
                <li><a href="{{ breadcrumb.url }}">{{ breadcrumb.title }}</a></li>
            {% endif %}
        {% endfor %}

    </ol>
</div>

權限控制到按鈕級別

將權限信息表的鍵改成permissions__name

建立過濾器register.filter

@register.filter
def has_permission(request, name):
    if name in request.session[settings.PERMISSION_SESSION_KEY]:
        return True

在前端頁面

{% if request|has_permission:'customer_add' %}
         <a class="btn btn-default" href="{% url 'customer_add' %} }">
         <i class="fa fa-plus-square" aria-hidden="true"></i> 添加客戶</a>
{% endif %}
相關文章
相關標籤/搜索