zoukankan      html  css  js  c++  java
  • day72 关于rbac组件的小部分面试题

    rbac的权限组件   基于角色的权限控制

    1.什么是权限? 

      url代表的就是一个权限

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

      表结构  以我们讲的课的内容为例

      菜单表: 

        - title 标题

        - icon 图标

        - weight 权重

      权限表:

        - url  权限 这里要用到正则匹配 不加^$

        - title 权限标题  展示分配

        - name URL别名 效果 : 把权限扩展到按钮级别,就是我没有这个权限,就没有这个按钮,而且要加上unique,保证权限唯一

        - menu 外键 关联到菜单表 Menu  (1对多关系)  效果 : 选中默认展开

          如果有menu_id, 说明是1级菜单下的2级菜单,如果没有,说明是普通的权限

        -parent 外键,  通过关联到自己的id 属于自关联 , 效果 : 为了解决(当你选中2级菜单下的添加或编辑下,左侧菜单关闭,处于未选中状态)的问题

          如果有parent_id, 说明1级菜单下的普通权限,如果没有,什么都不是 

        如果既没有menu_id,也没用parent_id, 说明是普通权限,而且也没有关联2级菜单

      角色表:

        - name 角色名称 

        - permission 外键 关联到权限信息表 (多对多关系)

      用户表: 

        - user 用户名

        -pwd 密码

        -roles 外键,关联角色表 (多对多关系)

    技术点 : 

      - 中间件 -process_request 

        1.获取当前的URL

          request.current_menu_id=None

          request.cbreadcurunb_list=[{'title': '首页',  'url': ' /index/ ' }]

         2.白名单

          from django.conf import settings

          settings.xxx  #不把白名单写死,下次修改直接才settings中修改即可

          这里需要用到re模块,re.marth()   # 从头开始匹配,匹配到一个就返回

        3.获取登录状态

         如果没有登录,redirect到login页面

        4.判断是不是免认证的url

        5.进行权限的校验

          首先先获取到本用户的权限信息,我们之前将用户的权限信息保存到了session中,所以这里我们要获取需要从session中获取.

          permision_dict = request.session[settings.xxx]

          .get到id ,pid ,pname

          判断有没有pid ,如果有,说明是子权限

          request.current_menu_id=pid

          如果没有pid.说明是父权限.

          request.current_menu_id=id

          request.cbreadcrumb_list.append({url:i[ url ], title : i [ title ] } )

        6.return Httpresponse('没有权限')

      - 登录

        1.认证 通过ORM操作去数据库中校验用户名密码是否正确

        2.认证成功后进行权限信息的初始化操作, init_permission(request,obj)

          - 获取当前用户的权限信息

          ORM

            values() 

            permission__title 跨表操作

            过滤权限为空的权限, filter(permissions__url__isnull=False)

            去重 distinct()

          - 构建权限和菜单数据结构

            权限的数据结构

              简单的控制    permission_list = [{ url : persission__url }]

              非菜单权限归属  permission_list=[ url  , pid , id  ]

              路径导航  permission_dict={ id : url , id , pid ,  title }

              最终版  permission_dict = {name : {url , id, pid, title ,pname}}

            菜单的数据结构

              menu_list = [ {url , title , icon }]

              menu_dict = {

                一级菜单的id :{ title , icon , weight children :{ url , title , id  }} }

          - 保存权限和菜单的信息到session中

            json序列化 数字当做字典的key 会变成字符串  

            settings

      -模板 

        动态生成菜单

          -inclusion_tag  自定义标签 返回一个HTML代码段

          - 有序字典 OrderDict()

          - sorted(可迭代对象,key=lamda x : x[xxx], reverse=True)

          - 两次for循环

        路径导航 

          - inclusion_tag

        权限控制到按钮级别

  • 相关阅读:
    $POST数组论证($GET || $COOKIE || $REQUEST 同理)
    PHP之preg_replace()与ereg_replace()正则匹配比较讲解
    PHP之mysql_real_escape_string()函数讲解
    浅析白盒审计中的字符编码及SQL注入
    PHP之list()函数讲解
    PHP之implode与explode函数讲解
    PHP之Error与Logging函数讲解
    Nextcloud私有云盘在Centos7下的部署笔记
    Linux下路由配置梳理
    实验c语言不同类型的指针互用(不推荐只是学习用)
  • 原文地址:https://www.cnblogs.com/zty1304368100/p/10584782.html
Copyright © 2011-2022 走看看