• 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 就不显示
  • 相关阅读:
    Hihocoder 1275 扫地机器人 计算几何
    CodeForces 771C Bear and Tree Jumps 树形DP
    CodeForces 778D Parquet Re-laying 构造
    CodeForces 785E Anton and Permutation 分块
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale 二分
    Hexo Next 接入 google AdSense 广告
    如何统计 Hexo 网站的访问地区和IP
    Design and Implementation of Global Path Planning System for Unmanned Surface Vehicle among Multiple Task Points
    通过ODBC接口访问人大金仓数据库
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/10461548.html
Copyright © 2020-2023  润新知