rbac组件


权限表设计:

  • 基于角色的权限控制

    • 用户表

    • id name
    • 角色表

    • id title
    • 用户角色关系表

    • id name_id title_id
    • 权限表

    • id url
    • 角色权限关系表

    • id title_id url_id

使用自定义rbac权限组件

  1. 拷贝rbac组件

  2. 清空migration目录

  3. 在setting注册rbac

    'rbac', #django 2.0以上
    
  4. 数据库迁移录入信息

  5. 创建超级管理,添加权限信息(组件admin.py已经定制化)

  6. 用户登录后做权限和菜单的初始化 init_permission

    from web import models
    from rbac import models
    #调用自定义权限和菜单组件
    from rbac.service.init_permission import init_permission
    
    def login(request):
        '''
        登录代码,成功后调用init_permission传入request、登录用户信息(obj)
        '''
        
        if request.method == 'GET':
           return render(request,'login.html')
        name=request.POST.get('name')
        pwd=request.POST.get('pwd')
        obj = models.UserInfo.objects.filter(name=name,password=pwd).first()
        if not obj:
            return render(request,'login.html',{'msg':'用户名密码错误'})
        request.session['user_info'] = {'id':obj.id,'name':obj.name}
        
        init_permission(request,obj)
        return redirect('/customer/list/')
    
  7. 应用中间件,进行权限校验

    'rbac.middleware.rbac.RbacMiddleware'
    
  8. 设置setting配置文件

    #############权限相关#######################
    PERMISSION_SESSION_KEY = 'permissions_list'
    MENU_SESSION_KEY = 'menu_list'
    #白名单
    VALID_URL = [
        '^/login/$',
        '^/admin/.*',
    ]
    
  9. 显示动态菜单(引入静态文件)、在菜单栏 +{% menu request %}、最上方导入{% load rbac %}

  10. 粒度控制到按钮

    1.  #加在需要控制的按钮上
          {% if request|has_permission:'add' %}
                     <a href="{% url 'add' %}">增加</a>
                 {% endif %}
      

阶段问题

  • 权限几张表?5张 (用户,角色,权限,用户角色,权限角色)
  • 简述权限流程
    • 粒度控制到了按钮级别的权限控制
    • 用户登录成功,获取权限信息,存入session,
    • 每次请求在中间件中做权限校验,中间件中获取用户请求的url,以及当前用户所拥有的所有权限,然后进行比较,
    • 使用inclusion_tag实现动态菜单
  • 为什么要把权限存入session
  • 静态文件和模块文件
  • 相关技术点
    • orm查询 –去空,–去重
    • 中间件 (用户登录白名单,权限验证)
    • inclusion_tag(自定义页面的一块内容,用的时候只需要调用)

image-20210512115130404

阶段问题总结(面试常问)

  1. 简述权限流程有
    • 粒度控制到了按钮级别的权限控制
    • 用户登录成功,获取权限信息,存入session,
    • 每次请求,在中间件中做权限校验,
    • 使用inclusion_tag实现动态菜单
  2. 如何实现控制到按钮的
    • 用户登录时,用户所拥有的权限,别名==django路由的name构造成了一个字典;(字典快)
    • 在页面中写了一个django模板的filter来进行判断是否显示
  3. 为什么要使用中间件
    • 所有请求在达到视图函数之前,必须经过中间件,所有在中间件中对请求做处理比较简单
  4. 模板中的特殊方法:inclusion_tag、simpletag、filter
  5. 权限中使用了几张表
    • 六张 用户、角色、用户角色、权限、角色权限、菜单
  6. 表中的字段(背表)
  7. 写流程(思维导图)

特殊字典的构造

  • 权限 = {
        权限别名:    {"id":'',"title":'','url':'','pid':''},
        {"id":'',"title":'','url':'','pid':''},
        {"id":'',"title":'','url':'','pid':''},
    }
    
  •     菜单 = {
            菜单ID:{
                title:'',
                icon:'',
                children:[
                    {id:'1', ...}
                ]
            }
        }
    

文章作者: Kexuan Shi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Kexuan Shi !
评论
  目录