rbac

动态生成一级菜单:

model里修改字段为

在登录查询用户时,将四个字段的信息都查询出来

并根据用户能够访问的网页权限和显示的菜单 blank表示页面输入可以为空 null=true 表示数据表可以为空

分为权限列表和菜单列表

permission_list

menu_list

权限信息用来验证用户能够访问的页面

菜单列表用来显示用户可以访问的页面

页面可以接受request

request.session.menu来得到ur,title,icon显示在页面上可以用for循环实现

一级菜单优化

在页面request.session.menu是写死了

创建templatetags包

里面my_tags.py

通过sample.inclusion.tags方法

写一个menu函数,再创建一个menu页面menu.html

里面讲request.session.menu内容复制进去

再在原页面写{%load my_tags%}

{%menu request%}导入

给访问的菜单加active属性

在menu函数里

因为知道要访问的页面url request.path_info

循环菜单列表时

如果这个菜单的url和访问页面相同时 用正则进行判断 re.match(item[url],request.path_info):

里面 item['class']=active加入active属性

在页面用menu.class显示

rbac功能整合

功能整合就是将rbac的所有函数,页面,css都拖到自己的rbac的app里,使rbac独立起来可以随时调用

应用rbac组件的流程

1.将rbac app直接拷贝进来

  在settings里注册rbac app

2 数据库的迁移

  1删除rbac下migrations下除init外的其他py文件

  2执行命令

3 录入权限信息 ,通过Django自带的admin页面

  1.首先创建超级用户

    python manage.py createsuperuser

  2.登录admin

    1.通过rbac里已经写完的角色,权限,用户信息

      录入权限信息 角色信息 用户信息

    2.分配对应的关系

4.登陆成功后调用权限初始化的函数permission

  通过permission将用的权限信息放入权限列表 菜单信息放入菜单列表

  from rbac.service.permission import init_permission

  init_permission(request,obj)  # 传入request和obj

5.在settings里注册权限的中间件

  MIDDLEWARE = [
        'rbac.middlewares.rbac.RbacMidlleware'   
]

  通过rbac的request进行权限的验证

并将权限相关的配置写入settings里

# 权限存放在session中的KEY

PERMISSION_SESSION_KEY = 'permission'

# 菜单存放在session中的KEY

MENU_SESSION_KEY = 'menu'

# 白名单

WHITE_LIST = [     r'^/login/$',    

r'^/reg/$',    

r'^/admin/.*', ]

6.将动态菜单加入到页面中应用到inclusion_tag

  {% load rbac %}
  {% menu request %}

  在页面里要导入菜单的静态文件

  1.menu.css

有一个母版页面,通过这个母版进行加入

 二级菜单

  如何建立一个二级菜单

  首先需要先建立菜单表

  菜单表只放入一级菜单的信息 name icon图标

  权限表添加menu字段用于关联菜单表

  并将菜单信息表的数据结构进行修改

  自定义inclusion.tag需要修改

  实现点击一级菜单隐藏显示二级菜单功能

  使用js功能

二级菜单默认展开并选中+一次菜单排序

通过js方法可以实现给二级菜单加active属性

但为了实现访问的页面所属的菜单能够展开,其他菜单闭合

在permssion里

利用创建一个querydict,菜单列表循环给所有一级菜单加入hide属性

当访问的二级菜单属于一级菜单时,将一级菜单的hide属性去掉,并给访问的二级菜单加active属性

实现一次菜单排序,需要给model里的menu表加入一个weight属性

每次登陆时查询用户的weight属性

并通过sort函数根据weight属性进行排序

将排序完的列表在根据上面的二级菜单加属性的流程走

通过inclusion.tag并在页面中展示

路径导航 

首先建立面包屑列表 request.breadcrumb_list =[

{'title': '首页', 'url': '/index/'}

]

在权限的校验中,如果是子权限访问的是三级菜单

先将二级菜单加入面包屑列表

request.breadcrumb_list.append( {'title': permission_dict[str(pid)]['title'], 'url': permission_dict[str(pid)]['url']})

 再将访问的页面加入面包屑列表

request.breadcrumb_list.append({'title': item['title'], 'url': item['url']})

创建inclusion_tag

@register.inclusion_tag('breadcrumb.html')

def breadcrumb(request):

  return {'breadcrumb_list': request.breadcrumb_list}

breadcrumb.html

<div>
    <ol class="breadcrumb no-radius no-margin" style="border-bottom: 1px solid #ddd;">

        {% for breadcrumb in breadcrumb_list %}
            {% if forloop.last %}
                <li class="active">{{ breadcrumb.title }}</li>
            {% else %}
                <li><a href="{{ breadcrumb.url }}">{{ breadcrumb.title }}</a></li>
            {% endif %}
        {% endfor %}

    </ol>
</div>

权限控制到按钮级别

将权限信息表的键改为permissions__name

创建过滤器register.filter

@register.filter
def has_permission(request, name):
    if name in request.session[settings.PERMISSION_SESSION_KEY]:
        return True

在前端页面

{% if request|has_permission:'customer_add' %}
         <a class="btn btn-default" href="{% url 'customer_add' %} }">
         <i class="fa fa-plus-square" aria-hidden="true"></i> 添加客户</a>
{% endif %}

 

posted @ 2019-03-11 23:30  Python张梦书  阅读(1517)  评论(0编辑  收藏  举报