RBAC
2024-10-15 22:54:28
什么是rbac?
-- 基于角色的权限控制 Role-Based Access Control
一个url就代表一个权限 // url分配给角色,角色分配给用户
-- 6个model,4张表
菜单表
name 标题
icon 图标
weight 权重 排序
权限表
title 标题 做显示用
url 正则表达式 str 不加^$ (a标签href属性 )
name url别名 --权限控制到按钮级别
menu 外键关联菜单表
parent 自关联/判断二级菜单的
角色表
name
permissions 多对多关联权限
用户表
name 账号
pwd 密码
roles 多对多关联角色表
manytomany -- django会创建下面2表:
角色和权限的关系表
用户和角色的关系表
流程:
权限控制流程 --
登录
首先经过 中间件 middleware /process_request
获取当前url地址 request.path_info
白名单 settings.py 列表[正则]
校验通过
路由匹配 login 视图函数
login页面
form表单 填用户名 密码 提交POST请求
中间件 白名单 login def post请求 校验账号密码
失败的话拒绝 跳转到重新登录
登录成功 --> 权限信息初始化 -> 函数init_permission(request,obj)
-->获取权限obj.roles.all().filter(permissions__url__isnull=False).values(permissions__跨表).distinct(去重) 过滤非空权限
保存数据到session中,json序列化数字电子字典的key,(注意str)
返回一个跳转location响应头 中间件 get请求 路由匹配 index页面 点击其他 开始真正的权限校验,正则匹配
匹配到了之后(字符串格式化^$),没有匹配到返回HttpResponse('无权限')
匹配成功之后,获取当前权限id和父权限id
权限的校验 -正则匹配 -匹配成功 id 权限的id pid 父权限的id 有pid 当前访问的是一个子权限 request.current_ment_id = pid 1. request.breadcrumb_list.append({ permission_dict [ str(pid) ] }) 2. request.breadcrumb_list.append({ permission_dict [ pname ] }) request.breadcrumb_list.append({ url title }) 没有pid 当前访问的是一个父权限 二级菜单 request.current_ment_id = id 路径导航 request.breadcrumb_list.append({ url title }) return HttpResponse('没有权限')
模板 动态生成二级菜单 inclusion_tag menu.html 两次for循环 排序 有序字典 字典也是个类 加()就是实例化
二级菜单class = active
一级菜单 class = '' 第一次循环的时候加了hide
路径导航 inclusion_tag breadcrumb.html 最后一个不可点击的状态
权限控制到按钮级别 --只有filter 能写在if 判断里,其他两个都是标签,-->
在模板里使用 html {% if request|has_permission:'customer_add' %} 返回布尔值
True 就显示
False 就不显示
最新文章
- MS SQL Server2014链接MS SQL Server 2000
- 【poj1738】 An old Stone Game
- canvas之2D上下文
- IOS UI segmentedControl UISegmentedControl 常见属性和用法
- windows下wordpress环境快速搭建
- Hibernate之HQL查询
- 获取文件属性信息之stat、fstat和lstat
- SwapEffect 枚举(定义交换效果)
- ES6的promise的学习
- 【POJ1113】Wall(凸包)
- 理解 angular 的路由功能
- Error:(72) error: unknown element <;user-permission>; found.
- strlen的容易tle情况
- OpenCV不同类型Mat的at方法访问元素时该如何确定模板函数的typename(转)
- [HDU5685]Problem A
- php array 根据value获取key,in_array()判断是否在数组内实例
- 8.19 extjs jar 包使用。
- Kotlin(2): 优雅地扩展类的方法和属性
- Linux中df命令查询磁盘信息和fdisk命令分区的用法
- C++学习之虚函数继承和虚继承
热门文章
- 20171129 ASP.NET中使用Skin文件
- 20170927 Webservice发布指定账户进行访问
- Linux系统启动排错实验集合
- VS2008生成数据库连接字串
- Python 全栈开发十 socket网络编程
- 18-Python3 迭代器与生成器
- C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作,无法为请求的 Configuration 对象创建配置文件。
- WinRAR 5.40 &; 4.20 &; 3.93 的注册码 - rarreg.key
- Cocos Creator 键盘监听事件
- python快速开发Web之Django