基於Python Flask的許可權管理4 載入選單

2022-04-04 03:27:37 字數 4600 閱讀 4872

本文實現了根據不同使用者載入不同的選單許可權。

前端登入成功之後會載入選單,傳送了乙個find_all_menu請求,該請求會根據使用者id載入選單,但是在專案組它並沒有傳id直接後端寫死了,所以我們要改下前端。

1.修改src\api\modules\menu.js的menu_user方法,使這個方法傳使用者id

2.修改src\store\modules\d2admin\modules\permission.js 使menu_userc傳入uuid

1.選單許可權表orm

from models.basemodel import

basemodel

from db import

dbclass

menu(basemodel):

"""選單許可權表

"""__tablename__ = "

t_menu

"id = db.column(db.integer, primary_key=true, autoincrement=true, comment="

選單id")

menu_name = db.column(db.string(50), comment="

選單名稱")

parent_id = db.column(db.integer, comment="

父選單id")

order_num = db.column(db.integer, comment="

顯示順序")

url = db.column(db.string(200), comment="

請求位址")

menu_type = db.column(db.integer, default=1, comment="

選單型別(1,目錄 2,選單 3,按鈕")

visible = db.column(db.integer, default=1, comment="

選單狀態(1顯示 2隱藏)")

perms = db.column(db.string(100), comment="

許可權標識")

icon = db.column(db.string(100), comment="

選單圖示")

is_frame = db.column(db.integer, default=2, comment="

是否外鏈")

route_name = db.column(db.string(100), default="", comment="

路由名稱")

route_path = db.column(db.string(100), default="", comment="

路由位址")

route_cache = db.column(db.integer, default=0, comment="

路由快取")

route_component = db.column(db.string(100), default="", comment="

路由元件

")

2.角色選單關係表orm

from db import

dbfrom models.basemodel import

basemodel

class

role_menu(basemodel):

"""角色選單關聯表

"""__tablename__ = "

t_role_menu

"id = db.column(db.integer, primary_key=true, autoincrement=true, comment="id"

) role_id = db.column(db.integer, comment="

角色id")

menu_id = db.column(db.integer, comment="

選單id")

create_by =none

created_at =none

update_by =none

updated_at =none

remark = none

3.使用者角色關係表orm

from db import

dbfrom models.basemodel import

basemodel

class

user_role(basemodel):

"""使用者角色關聯表

"""__tablename__ = "

t_user_role

"id = db.column(db.integer, primary_key=true, autoincrement=true, comment="id"

) user_id = db.column(db.integer, comment="

使用者id")

role_id = db.column(db.integer, comment="

角色id")

create_by =none

created_at =none

update_by =none

updated_at =none

remark = none

from permission import *menu = blueprint('

menu

', __name__)

/api/menu

')5.find_all_menu介面實現

@menu.route('

/find_all_menu

', methods=["

post"])

#@login_required

deffind_all_menu():

'''根據使用者id獲取選單

:return:

'''res_dir =request.get_json()

user_id = res_dir.get("

uuid")

data = constructmenutrees(user_id=user_id) #

獲取選單樹

return jsonify(code=code.success.value, msg="

ok", data=data)

通過遞迴實現根據父id查詢子選單,如果傳入使用者id則只查詢該使用者的許可權否則查詢所有許可權,一級選單父id預設是0

def constructmenutrees(parentid=0, user_id=none):

'''通過遞迴實現根據父id查詢子選單,如果傳入使用者id則只查詢該使用者的許可權否則查詢所有許可權,一級選單父id預設是0

1.根據父id獲取該選單下的子選單或許可權

2.遍歷子選單或許可權,繼續向下獲取,直到最小級選單或許可權

3.如果沒有遍歷到,返回空的陣列,有返回許可權列表

:param user_id:

:param parentid:

:return:dict

'''if

user_id:

menu_data = menu.query.join(role_menu, menu.id ==role_menu.menu_id).join(user_role,

user_role.role_id ==role_menu.role_id).filter(

user_role.user_id == user_id).filter(menu.parent_id == parentid).order_by('

order_num

').all()

else

: menu_data = menu.query.filter(menu.parent_id == parentid).order_by('

order_num

').all()

menu_dict =menu_to_dict(menu_data)

if len(menu_dict) >0:

data =

for menu in

menu_dict:

menu[

'children_list

'] = constructmenutrees(menu['id'

], user_id)

return

data

return

查詢出來的資料是無序的,前端顯示不夠直白,這邊格式化一下

def

menu_to_dict(result):

'''格式化選單字段顯示順序

:param result:

:return:

'''data =

for menu in

result:

child =

return data

6.點選登入之後,成功顯示許可權

基於Python Flask的許可權管理 目錄

後端 前端 基於python flask的許可權管理1 框架選擇和資料庫設計 基於python flask的許可權管理2 前端準備 基於python flask的許可權管理3 後端設計 基於python flask的許可權管理4 基於token的登入 基於python flask的許可權管理5 字典...

基於密碼破解的提權

密碼獲取的常用手段 1.通過中間人劫持 網路監聽 2.通過使用者主機竊聽 鍵盤記錄 3.通過簡單猜測 常用的密碼 4.通過系統漏洞 永恆之藍 rpc服務445埠協議 5.使用者自己洩露 git 配置檔案等漏洞方式 6.通過系統後門 shift後門 windows密碼原理 windows使用了兩種方法...

基於cookie的簡單鑑權與JWT鑑權

cookie鑑權在本文沒有做token的加密,通過token 使用者資訊json鍵值對的方式存入redis,這樣避免了session共享的問題,由於本文實現上省略了token加密,不能從cookie裡解密拿到使用者資訊,再加上cookie有被偽造的風險,所以安全性較低.有token加密的實現在本文j...