当用户登陆后,根据用户的角色要为用户生成对应的权限菜单,此时需要将登陆的用户信息获取且获取角色信息,从数据库中获取菜单以及权限信息,并且存入session中。

1、权限流程

第一次请求的页面是登陆页面,已经被列入白名单,根据登陆的用户信息,获取用户的角色信息,从而拿到一个或者多个角色的权限、菜单信息,并且将其保存在session中,当用户第二次发起请求时,通过权限校验(通过之前保存在session中的信息,利用中间件进行校验),获取用户的菜单和权限信息,这样就完成了用户权限的设置。

2、权限初始化

从数据库中获取该用户的权限和菜单信息,并且存入session中。

from django.conf import settings

class InitPermission(object):

    def __init__(self,request,user):
"""
:param request: 传入request对象
:param user: 传入用户对象
""" self.request=request
self.user=user
self.menu_dict={}
self.permissions_dict={} def init_data(self):
"""
从数据库中获取权限信息以及用户信息
:return:
"""
self.permissions_queryset=self.user.roles.filter(permissions__url__isnull=False).values(
'permissions__id',
'permissions__url',
'permissions__title',
'permissions__name',
'permissions__parent_id',
'permissions__parent__name',
'permissions__menu_id',
'permissions__menu__title',
'permissions__menu__icon',
).distinct()
return self.permissions_queryset def init_permissions_dict(self):
"""
构建权限列表,并且存入session
self.permissions_dict={
'customer_list':{'id':1,'url':'/customer/list/','title':'客户列表','pid':'父权限id'}
...
}
:return:
"""
for row in self.init_data():
self.permissions_dict[row['permissions__name']]={
'id':row['permissions__id'],
'url': row['permissions__url'],
'title': row['permissions__title'],
'pid':row['permissions__parent_id'],
'pname':row['permissions__parent__name'],
}
self.request.session[settings.PERMISSION_SESSION_KEY]=self.permissions_dict def init_menu_dict(self):
"""
构建菜单字典并且存入session,之所以构建字典,可以通过键值进行排序
self.menu_dict={
1:{
title:'客户管理',icon:'fa fa-coffe',children:[
{'id':1,'url':'/customer/list/','title':'客户列表'}
...
]
}
}
:return:
"""
for row in self.init_data():
menu_id=row['permissions__menu_id']
if not menu_id:
continue
if menu_id not in self.menu_dict:
self.menu_dict[menu_id]={
'title': row['permissions__menu__title'],
'icon': row['permissions__menu__icon'],
'children': [
{'id':row['permissions__id'],'title': row['permissions__title'], 'url': row['permissions__url']}
]
}
else:
self.menu_dict[menu_id]['children'].append(
{'id': row['permissions__id'], 'title': row['permissions__title'], 'url': row['permissions__url']}
)
self.request.session[settings.MENU_SESSION_KEY] = self.menu_dict

3、权限校验

当用户进行登陆时,需要进行权限校验,通过中间件进行判断。

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render,HttpResponse,redirect
from django.conf import settings
import re class PermissionMiddleWare(MiddlewareMixin):
"""
权限控制的中间件
""" def process_request(self, request):
"""
权限控制
:param request:
:return:
"""
# 1. 获取当前请求URL
current_url = request.path_info
print('current_path',current_url) # 1.5 白名单处理
for reg in settings.VALID_URL:
if re.match(reg,current_url):
return None # 2. 获取当前用户session中所有的权限
permissions_dict = request.session.get(settings.PERMISSION_SESSION_KEY)
if not permissions_dict:
return redirect('/login/') # 3. 进行权限校验
flag = False
request.breadcrumb_list=[{'title':'首页','url':'/index/'}]
for item in permissions_dict.values():
id=item['id']
pid=item['pid']
reg = "%s$" % item['url']
print('reg',reg)
if re.match(reg, current_url):
if pid: #访问的是添加客户网页
request.current_menu_id=pid #让它与可以作为权限菜单的客户列表挂钩
###导航条自动生成
request.breadcrumb_list.extend([
{'title':permissions_dict[item['pname']]['title'],'url':permissions_dict[item['pname']]['url']},
{'title':item['title'],'url':item['url']}
]
)
else:
request.current_menu_id=id
###导航条自动生成
request.breadcrumb_list.extend([
{'title':item['title'],'url':item['url']}
]
)
flag = True
break
if not flag:
return HttpResponse('无权访问')

4、前端生成页面

前端生成menu菜单以及breadcrumb导航条

...
<div class="pg-body">
<div class="left-menu">
<div class="menu-body">
{% menu request %}
</div>
</div>
<div class="right-body">
<div>
<ol class="breadcrumb no-radius no-margin" style="border-bottom: 1px solid #ddd;">
{% breadcrumb request %}
</ol>
</div>
{% block content %} {% endblock %}
</div>
</div>
...

menu.py

from django.template import Library
from django.conf import settings
from collections import OrderedDict register=Library() @register.inclusion_tag('rbac/menu.html')
def menu(request):
#获取session中的菜单列表
menu_dict=request.session.get(settings.MENU_SESSION_KEY)
order_dict=OrderedDict()
if menu_dict:
for key in sorted(menu_dict): #按照菜单id升序对菜单进行排序
order_dict[key]=menu_dict[key]
menu_dict[key]['class']='hide'
for child in menu_dict[key]['children']:
if request.current_menu_id==child['id']: #非菜单权限以及菜单权限默认展开
child['class']='active'
menu_dict[key]['class'] = ''
return {"menu_dict":menu_dict} @register.inclusion_tag('rbac/breadcrumb.html')
def breadcrumb(request):
return {'breadcrumb_list':request.breadcrumb_list}
<div class="multi-menu">

    {% for item in menu_dict.values %}
<div class="item">
<div class="title"><span class="icon-wrap"><i class="{{ item.icon }}"></i></span> {{ item.title }}</div>
<div class="body {{ item.class }}">
{% for child in item.children %}
<a href="{{ child.url }}" class="{{ child.class }}">{{ child.title }}</a>
{% endfor %}
</div>
</div>
{% endfor %} </div>

menu.html

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

breadcrumb.html

rbac组件之权限初始化(五)的更多相关文章

  1. rbac组件之权限操作(四)

    对于权限表的操作有两种方式,第一种是一个个的权限进行curd,另外一种是批量操作,自动发现django程序中的路由,进行批量curd,首先介绍第一种方式. 因为在列出菜单时,已经将权限列表列出来了,所 ...

  2. python 全栈开发,Day108(客户管理之权限控制,客户管理之动态"一级"菜单,其他应用使用rbac组件,django static文件的引入方式)

    一.客户管理之权限控制 昨天的作业,有很多不完善的地方 下载代码,基本实现权限验证 https://github.com/987334176/luffy_permission/archive/v1.2 ...

  3. RESTful-rest_framework认证组件、权限组件、频率组件-第五篇

    认证组件.权限组件.频率组件总结:  认证组件格式: 1 写一个认证类 from rest_framework.authentication import BaseAuthentication cla ...

  4. rbac组件

    创建新项目 新建一个项目untitled,注意django 版本为1.11 修改models.py,增加2个表 from django.db import models class Classes(m ...

  5. CRM rbac 组件的应用

    1 拷贝 rbac 组件到项目中,注册这个app 2 数据库迁移 1 删除rbac下migrations里除了init外的文件 2 修改用户表 class User(models.Model): &q ...

  6. 应用rbac组件 动态生成一级菜单

    动态生成一级菜单 改表结构 需要知道是否是菜单\icon\名称权限表 +字段: is_menu = models.BooleanField(max_length=32,verbose_name='是否 ...

  7. CRM【第一篇】: 权限组件之权限控制

    1. 问:为什么程序需要权限控制? 答:生活中的权限限制,① 看灾难片电影<2012>中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临:② 屌丝们,有没有想过为什么那些长得漂亮身 ...

  8. DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  9. python 全栈开发,Day107(CRM初始,权限组件之权限控制,权限系统表设计)

    一.CRM初始 CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销 ...

随机推荐

  1. 组合数学练习题(二)——Chemist

    题意: 在一个 n 维无限空间中,一开始原点处有一个细胞.细胞每秒都会增殖,每个原有细胞都会消亡,在与它曼哈顿距离恰为 1的所有位置都会新增一个细胞.求 T 秒后,原点处会有多少细胞,答案 mod10 ...

  2. linux自动删除30天前的日志文件

    linux应用总结: 自动删除n天前的日志文件: . 使用的命令格式如下: find 对应目录 -mtime +天数 -name "文件名" -exec -rm -rf -name ...

  3. [Usaco2005 Feb]Feed Accounting 饲料计算

    Description Farmer John is trying to figure out when his last shipment of feed arrived. Starting wit ...

  4. Android 内存溢出处理方案

    转自 : http://www.cnblogs.com/hello-ruby/archive/2013/04/19/3031098.html 首先我们来看看android内存溢出的原因,有可能是: 由 ...

  5. 使用mysql实现mybatis的分页效果

    1.mybatis.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configur ...

  6. DB buffer bussy wait 分析一例

    ####sample 1: DB层分析OI DB层分析OI的信息如下: 1. 异常时间段,  Logical reads:/ Physical reads/ Physical write  指标都低于 ...

  7. 448 Find All Numbers Disappeared in an Array 找到所有数组中消失的数字

    给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次.找到所有在 [1, n] 范围之间没有出现在数组中的数字.您能在不使用 ...

  8. 手写一套迷你版HTTP服务器

    本文主要介绍如何通过netty来手写一套简单版的HTTP服务器,同时将关于netty的许多细小知识点进行了串联,用于巩固和提升对于netty框架的掌握程度. 服务器运行效果 服务器支持对静态文件css ...

  9. [BZOJ1016][JSOI2008]最小生成树计数 最小生成树 搜索

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1016 做这道题之前需要知道一些结论,同一个图的最小生成树中相同权值的边的个数是不会变的,如 ...

  10. Rxjava2的学习与总结

    博客地址:https://luhaoaimama1.github.io/2017/07/31/rxjava/