Django-rbac權限


1、注冊應用rbac

2、設計表

權限表

角色表

用戶表

不同角色有不同的權限,給每個用戶分配不同的角色(一個用戶可以有多個角色)

3、數據注入

將數據注入在rbac中封裝成一個函數

4、權限認證是在中間件進行的

我們將中間件也寫在組件內

在settings注冊中間件:

5、settings中配置我們經常用到的變量

6、配置路由分發

6、菜單欄權限分配

創建菜單表

菜單與權限一對多關聯

表結構如下:

菜單表:

權限表:

給這些url分配菜單,哪個url屬於哪些菜單,后面的pid是為了表示從屬關系,

7、權限注入

登錄成功后將用戶的所有權限和權限中是菜單的信息保存在session中

取出當前登錄用戶擁有的所有權限,根據權限表中的menu_id判斷哪些權限屬於一級菜單;

構建菜單的數據結構,方便前端渲染;

所有權限保存在一個變量中保存到session中;

菜單權限保存在一個變量中保存到session中;

 # 判斷是否是一級菜單
        if item["menu_id"]:
            # 如果menu_id在權限列表中,表示已經存在二級菜單,
            if item["menu_id"] in permisson_is_menu_dict:
                permisson_is_menu_dict[item["menu_id"]]["children"].append({
                    "pk":item["pk"],"title": item["title"], "url": item["url"]
                })
            else:
                # 設計菜單欄數據結構(方便前端渲染)
                permisson_is_menu_dict[item["menu_id"]] = {
                    "title": item["menu__title"],
                    "icon": item["menu__icon"],
                    "children": [
                        { "pk":item["pk"],"title": item["title"], "url": item["url"]},
                    ]
                }

8、權限認證

權限認證在中間件中,因為每訪問一個網頁都需要走一遍中間件

取出保存在session中的當前登錄用戶的權限數據與當前請求的url進行匹配

# 權限認證
for item in request.session[settings.PERMISSION_LIST]:
    res = "^%s$"%item
    ret = re.search(res,request.path)
    if ret:
        return None
return HttpResponse("您的權限不夠不能訪問該頁面!!!")

9、菜單欄渲染

通過自定義標簽給頁面渲染菜單

取出我們在登陸后保存在session中的菜單數據

import re
from django import template
from django.conf import settings
register = template.Library()

# 自定義標簽
@register.inclusion_tag("result.html")
def create_label(request):
    menu_dict = request.session.get(settings.PERMISSION_MENU_DICT)
    for key, item in menu_dict.items():
        # 默認給二級標簽添加隱藏樣式
        item["class"] = "hide"
        for child in item["children"]:
            # if re.match("^{}$".format(child["url"]), request.path):
            # 當前訪問路徑的pid如果等於它二級菜單的id證明他倆是屬於同一個一級菜單,
            # 如果是屬於同一個一級菜單,我們就讓這個二級菜單一直顯示,並給它添加選中樣式;
            # request.show_id是當前請求路徑的id值,我們在中間件中將當前請求路徑的id封裝在了request中
            if request.show_id == child["pk"]:
                item["class"] = ""
                child["class"] = "active"
                break
    return  {"menu_dict" :menu_dict }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM