权限管理面试会问的:

  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  %}

猜你喜欢

转载自www.cnblogs.com/zhang-da/p/12188908.html