• 权限管理:


    1. RBAC 基于角色的权限控制

    2. 如何实现权限控制的?

      url 代表的权限

      表结构

       简单实现权限控制
       
       权限表
       
       - url     url地址的正则表达式的字符串 ^$  
       - title   标题  展示用
       
       角色表
       
       - name  角色的名称
       - permissions   多对多  关联权限
       
       用户表
       
       - username  用户名
       - password  密码
       - roles  多对多  关联角色
       
       动态生成一级菜单
       权限表
       
       - url     url地址的正则表达式的字符串 ^$  
       - title   标题  展示用
       - is_menu  是否是菜单
       - icon    图标
       
       角色表
       
       - name  角色的名称
       - permissions   多对多  关联权限
       
       用户表
       
       - username  用户名
       - password  密码
       - roles  多对多  关联角色
       
       
       动态生成二级菜单
       菜单表
       - title  标题
       - icon   图标
       - weight 权重
       
       权限表
       
       - url     url地址的正则表达式的字符串 ^$  
       - title   标题  展示用
       - menu    外键 关联一级菜单  blank  null
       
       
       角色表
       
       - name  角色的名称
       - permissions   多对多  关联权限
       
       用户表
       
       - username  用户名
       - password  密码
       - roles  多对多  关联角色
       
       非菜单权限归属
       菜单表
       - title  标题
       - icon   图标
       - weight 权重
       
       权限表
       
       - url     url地址的正则表达式的字符串 ^$  
       - title   标题  展示用
       - menu    外键 关联一级菜单  blank  null
       - parent  自关联
       
       
       角色表
       
       - name  角色的名称
       - permissions   多对多  关联权限
       
       用户表
       
       - username  用户名
       - password  密码
       - roles  多对多  关联角色
       
       
       权限控制到按钮级别
       菜单表
       - title  标题
       - icon   图标
       - weight 权重
       
       权限表
       
       - url     url地址的正则表达式的字符串 ^$  
       - title   标题  展示用
       - name    url别名  unique
       - menu    外键 关联一级菜单  blank  null
       - parent  自关联
       
       
       角色表
       
       - name  角色的名称
       - permissions   多对多  关联权限
       
       用户表
       
       - username  用户名
       - password  密码
       - roles  多对多  关联角色
      1. 流程 + 技术点

        1. 登录成功后保存权限(菜单)信息(函数 permission_init)

          1. 查询

            data = obj.roles.exclude(permissions__url=None).values(

            'permissions__url',

            'permissions__title',

            ).distinct()

          2. 构建数据结构

             简单权限控制
             permission_list = [{‘permissions__url’:url}]
             
             一级菜单
             permission_list = [{‘url’:url}]
             menu_list = [ {'url','icon','title'} ]
             
             
             二级菜单
             permission_list = [{‘url’:url}]
             menu_dict = {
              一级菜单的id : {
              'title',
              'icon',
              'children':[
              { 'url' 'title' }
              ]
              }
             
             }
             
             二级菜单  对一级菜单进行排序
             permission_list = [{‘url’:url}]
             menu_dict = {
              一级菜单的id : {
              'title',
              'icon',
              'weight'
              'children':[
              { 'url' 'title' }
              ]
              }
             
             }
             
             
             非菜单权限归属
             permission_list = [{‘url’:url,'id' 'pid'}]
             menu_dict = {
              一级菜单的id : {
              'title',
              'icon',
              'weight'
              'children':[
              { 'url' 'title' 'id' }
              ]
              }
             
             }
             
             路径导航
             permission_dict = { 权限的id :{‘url’:url,'id' 'pid'  'title'} }
             menu_dict = {
              一级菜单的id : {
              'title',
              'icon',
              'weight'
              'children':[
              { 'url' 'title' 'id' }
              ]
              }
             
             }
             
             
             权限控制到按钮级别
             permission_dict = { 权限的name :{‘url’:url,'id' 'pid'  'title' ,'pname'} }
             
             menu_dict = {
              一级菜单的id : {
              'title',
              'icon',
              'weight'
              'children':[
              { 'url' 'title' 'id' }
              ]
              }
             
             }
             
          3. 保存到session中

            request.session[settings.PERMISSION_SESSION_KEY] =

            request.session[settings.MENU_SESSION_KEY] =

        2. 中间件

          process_request

          1. 获取当前访问的url地址

          2. 白名单

            1. re.match

            2. settings.WHITE_LIST

          3. 登录状态的校验

          4. 免认证的校验

          5. 权限的校验

            1. 从session中获取权限

            2. 正则匹配

          6. 拒绝请求

        3. 模板

          1. inclusion_tag filter

             1. 在app下创建一个templatetags的Python包
             2. 在包内创建一个python文件   my_tag.py
             3. 在python文件中写固定的代码
              from django import template
              register = template.Library()
             4. 写函数 + 加装饰器
             
             @register.inclusion_tag('模板的名字')
             def xxx(*args,**kwargs):
                 return {}
             
             @register.filter
             def filter(value,arg):
                 return 'xxxx'
             
             @register.simple_tag
             def simple_tag(*args,**kwargs):
                 return 'xxxx'
             
             5. 使用
             模板
             {% load my_tag %}
             
             {% xxx c1 x2 k1=v1  %}
             
             {{ v|filter:arg }}
             
             {% simple_tag  c1 x2 k1=v1  %}
  • 相关阅读:
    多表查询
    mysql记录的增删改和单表查询
    作业45
    修改表 复制表
    多表关联
    约束
    关于服务器raid的一个记录
    安装linux操作系统--浪潮服务器
    关于python中的__new__方法
    关于类的总结之二
  • 原文地址:https://www.cnblogs.com/zhang-da/p/12188908.html
Copyright © 2020-2023  润新知