day72 关于rbac组件的小部分面试题

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

1.什么是权限? django

  url表明的就是一个权限json

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

  表结构  以咱们讲的课的内容为例数据结构

  菜单表: app

    - title 标题url

    - 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

    权限控制到按钮级别

相关文章
相关标签/搜索