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 }