day72 关于rbac组件的小部分面试题
rbac的权限组件 基于角色的权限控制
1.什么是权限?
url代表的就是一个权限
2.如何实现权限的控制?
表结构 以我们讲的课的内容为例
菜单表:
- title 标题
- icon 图标
- weight 权重
权限表:
- url 权限 这里要用到正则匹配 不加^$
- title 权限标题 展示分配
- name URL别名 效果 : 把权限扩展到按钮级别,就是我没有这个权限,就没有这个按钮,而且要加上unique,保证权限唯一
- menu 外键 关联到菜单表 Menu (1对多关系) 效果 : 选中默认展开
如果有menu_id, 说明是1级菜单下的2级菜单,如果没有,说明是普通的权限
-parent 外键, 通过关联到自己的id 属于自关联 , 效果 : 为了解决(当你选中2级菜单下的添加或编辑下,左侧菜单关闭,处于未选中状态)的问题
如果有parent_id, 说明1级菜单下的普通权限,如果没有,什么都不是
如果既没有menu_id,也没用parent_id, 说明是普通权限,而且也没有关联2级菜单
角色表:
- name 角色名称
- permission 外键 关联到权限信息表 (多对多关系)
用户表:
- user 用户名
-pwd 密码
-roles 外键,关联角色表 (多对多关系)
技术点 :
- 中间件 -process_request
1.获取当前的URL
request.current_menu_id=None
request.cbreadcurunb_list=[{'title': '首页', 'url': ' /index/ ' }]
2.白名单
from django.conf import settings
settings.xxx #不把白名单写死,下次修改直接才settings中修改即可
这里需要用到re模块,re.marth() # 从头开始匹配,匹配到一个就返回
3.获取登录状态
如果没有登录,redirect到login页面
4.判断是不是免认证的url
5.进行权限的校验
首先先获取到本用户的权限信息,我们之前将用户的权限信息保存到了session中,所以这里我们要获取需要从session中获取.
permision_dict = request.session[settings.xxx]
.get到id ,pid ,pname
判断有没有pid ,如果有,说明是子权限
request.current_menu_id=pid
如果没有pid.说明是父权限.
request.current_menu_id=id
request.cbreadcrumb_list.append({url:i[ url ], title : i [ title ] } )
6.return Httpresponse('没有权限')
- 登录
1.认证 通过ORM操作去数据库中校验用户名密码是否正确
2.认证成功后进行权限信息的初始化操作, init_permission(request,obj)
- 获取当前用户的权限信息
ORM
values()
permission__title 跨表操作
过滤权限为空的权限, filter(permissions__url__isnull=False)
去重 distinct()
- 构建权限和菜单数据结构
权限的数据结构
简单的控制 permission_list = [{ url : persission__url }]
非菜单权限归属 permission_list=[ url , pid , id ]
路径导航 permission_dict={ id : url , id , pid , title }
最终版 permission_dict = {name : {url , id, pid, title ,pname}}
菜单的数据结构
menu_list = [ {url , title , icon }]
menu_dict = {
一级菜单的id :{ title , icon , weight children :{ url , title , id }} }
- 保存权限和菜单的信息到session中
json序列化 数字当做字典的key 会变成字符串
settings
-模板
动态生成菜单
-inclusion_tag 自定义标签 返回一个HTML代码段
- 有序字典 OrderDict()
- sorted(可迭代对象,key=lamda x : x[xxx], reverse=True)
- 两次for循环
路径导航
- inclusion_tag
权限控制到按钮级别
day72 关于rbac组件的小部分面试题的更多相关文章
- rbac组件
创建新项目 新建一个项目untitled,注意django 版本为1.11 修改models.py,增加2个表 from django.db import models class Classes(m ...
- python 全栈开发,Day108(客户管理之权限控制,客户管理之动态"一级"菜单,其他应用使用rbac组件,django static文件的引入方式)
一.客户管理之权限控制 昨天的作业,有很多不完善的地方 下载代码,基本实现权限验证 https://github.com/987334176/luffy_permission/archive/v1.2 ...
- CRM rbac 组件的应用
1 拷贝 rbac 组件到项目中,注册这个app 2 数据库迁移 1 删除rbac下migrations里除了init外的文件 2 修改用户表 class User(models.Model): &q ...
- 应用rbac组件 动态生成一级菜单
动态生成一级菜单 改表结构 需要知道是否是菜单\icon\名称权限表 +字段: is_menu = models.BooleanField(max_length=32,verbose_name='是否 ...
- ch1-vuejs基础入门(hw v-bind v-if v-for v-on v-model 应用组件简介 小案例)
1 hello world 引入vue.min.js 代码: ----2.0+版本 <div id="test"> {{str}} </div> <s ...
- 详解封装微信小程序组件及小程序坑(附带解决方案)
一.序 上一篇介绍了如何从零开发微信小程序,博客园审核变智障了,每次代码都不算篇幅,好好滴一篇原创,不到3分钟从首页移出来了.这篇介绍一下组件封装和我的踩坑历程. 二.封装微信小程序可复用组件 首先模 ...
- rbac组件权限按钮,菜单,可拔插
1.通用模板 overflow: auto; //在a和b模板中进行切换 a 模板 :左侧菜单跟随滚动条 b模板 左侧以及上不动 **** <!DOCTYPE html> <h ...
- rbac组件引用
一. 批量操作思路 # 待新增 路由系统中有,但是数据库中还没有 路由系统的集合 - 数据库中权限集合 # 待更新 路由系统中有,数据库中也有, 只是更改了一些信息 路由系统的集合 & 数据库 ...
- 2、rbac组件 后台布局模板,权限按钮,菜单,可拔插,路径重定向
1.后台布局管理 https://www.cnblogs.com/venicid/p/7772742.html#_label0 1.通用模板 overflow: auto; //在a和b模板中进行切换 ...
随机推荐
- Painter's Problem (高斯消元)
There is a square wall which is made of n*n small square bricks. Some bricks are white while some br ...
- 微信小程序 地图地址解析
1.微信小程序提供了几个方式,引入地图, wx.getLocation(OBJECT) 获取当前的地理位置.速度.当用户离开小程序后,此接口无法调用:当用户点击“显示在聊天顶部”时,此接口可继续调用 ...
- springmvc学习路线1-基本配置
1.第一个springmvc实例helloword 关键点拨 1.1 web.xml文件的配置 <servlet> <servlet-name>springMVC</se ...
- java329 继承、类的高级概念
- Python 用户交互程序Input
1.用户交互,用户输入 用户输出命令是input. 设置一个变量并输出. name = input("name:") print(name) 注:python2 下 raw_inp ...
- 关于oracle result_cache
结果集缓存 和聚合物化视图类似,报表系统和数据仓库系统是最适合结果集缓存的,这些系统通常具有大量复杂的SQL,其中不少子查询包含聚合函数,如果能够尽可能重用这些已经计算过的聚合结果集,将极大的提升系统 ...
- UVA1160 X-Plosives
思路 每个元素设为点,化合物设为边 不能出现k条边k个点的环 直接并查集检查即可 代码 #include <cstdio> #include <algorithm> #incl ...
- 深度学习课程笔记(十八)Deep Reinforcement Learning - Part 1 (17/11/27) Lectured by Yun-Nung Chen @ NTU CSIE
深度学习课程笔记(十八)Deep Reinforcement Learning - Part 1 (17/11/27) Lectured by Yun-Nung Chen @ NTU CSIE 201 ...
- 在 mac iTerm2 中使用 cmd 终端
在 mac iTerm2 中使用 cmd 终端 主要是因为要在 window 中做一些命令行上的工作, 但又不想切换到整个 window 系统里面去. 在程序和功能中开启 telnet 在服务中启用 ...
- redis缓存服务器集群搭建
一.安装redis 1.下载redis [root@redis ~]# wget http://download.redis.io/releases/redis-4.0.11.tar.gz 2.安装编 ...