RBAC
基于角色的权限访问控制(Role-Based Access Control)
表结构设计
权限分组和权限操作的意义 : 每一个权限都是对应着增删改查的操作, 将相同数据的操作放到一个组中, 可以在渲染时判断该用户在本页面数据中是否可以执行其他操作, 可以控制按钮的渲染
流程说明
初次登陆时获取用户权限 :
- 连表查询 : 查询该用户所有的角色能访问的地址, 然后去重
- 组织数据 : 将所有权限按组分, 保存路由和可以进行的操作(为了控制按钮)
再次登录时判断 :
获得请求的路径, 与每个组下的路径匹配, 匹配成功保留该组的操作, 终止循环. 如果循环没有被终止, 则该用户无权访问该路径
左侧菜单栏的控制
用户登录时, 将菜单信息也读取出来写入session
要获取的信息 :
- 菜单名
- 菜单ID
- 权限的url
- 权限的标题
- 父ID (并不是所有的路由都要展示在左侧栏中, 这个只有没有父ID的才需要渲染)
查到数据循环构建
获取当前路由
构建字典, 匹配成功就将本路由与所属菜单的的active均改为True
最终要构建的形式
menu_dict = { #键是菜单表的主键 1: { "title": "菜单一", # 菜单名 "active": False, # 是否展开菜单 "children": [ {"title": "添加用户", "url": "xxxxxxxxxxx", "active": False}, # 字典中的"active"是是否标识,只要有二级菜单被标识,则一级菜单一定是展开的 {"title": "查看用户", "url": "xxxxxxxxxxx", "active": False}, ]}, 2: { "title": "菜单二", "active": False, "children": [ {"title": "添加用户", "url": "xxxxxxxxxxx", "active": False}, {"title": "查看用户", "url": "xxxxxxxxxxx", "active": False}, ]} }