什么是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 就不显示

最新文章

  1. MS SQL Server2014链接MS SQL Server 2000
  2. 【poj1738】 An old Stone Game
  3. canvas之2D上下文
  4. IOS UI segmentedControl UISegmentedControl 常见属性和用法
  5. windows下wordpress环境快速搭建
  6. Hibernate之HQL查询
  7. 获取文件属性信息之stat、fstat和lstat
  8. SwapEffect 枚举(定义交换效果)
  9. ES6的promise的学习
  10. 【POJ1113】Wall(凸包)
  11. 理解 angular 的路由功能
  12. Error:(72) error: unknown element <user-permission> found.
  13. strlen的容易tle情况
  14. OpenCV不同类型Mat的at方法访问元素时该如何确定模板函数的typename(转)
  15. [HDU5685]Problem A
  16. php array 根据value获取key,in_array()判断是否在数组内实例
  17. 8.19 extjs jar 包使用。
  18. Kotlin(2): 优雅地扩展类的方法和属性
  19. Linux中df命令查询磁盘信息和fdisk命令分区的用法
  20. C++学习之虚函数继承和虚继承

热门文章

  1. 20171129 ASP.NET中使用Skin文件
  2. 20170927 Webservice发布指定账户进行访问
  3. Linux系统启动排错实验集合
  4. VS2008生成数据库连接字串
  5. Python 全栈开发十 socket网络编程
  6. 18-Python3 迭代器与生成器
  7. C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作,无法为请求的 Configuration 对象创建配置文件。
  8. WinRAR 5.40 & 4.20 & 3.93 的注册码 - rarreg.key
  9. Cocos Creator 键盘监听事件
  10. python快速开发Web之Django