zoukankan      html  css  js  c++  java
  • RBAC

    什么是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 就不显示
  • 相关阅读:
    记录一次有意思的XSS过滤绕过2
    2018年总结
    记录一次Oracle注入绕waf
    记录一次有意思的XSS过滤绕过
    绕过阿里云waf进行SQL注入
    CRLF在过滤XSS语句后打Cookie方式
    JavaWeb之商品查看后历史记录代码实现
    Mysql注入小tips --持续更新中
    JDK动态代理(Proxy)的两种实现方式
    ajax 异步刷新
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/10461548.html
Copyright © 2011-2022 走看看