rbac组件之权限初始化(五)
当用户登陆后,根据用户的角色要为用户生成对应的权限菜单,此时需要将登陆的用户信息获取且获取角色信息,从数据库中获取菜单以及权限信息,并且存入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组件之权限初始化(五)的更多相关文章
- rbac组件之权限操作(四)
对于权限表的操作有两种方式,第一种是一个个的权限进行curd,另外一种是批量操作,自动发现django程序中的路由,进行批量curd,首先介绍第一种方式. 因为在列出菜单时,已经将权限列表列出来了,所 ...
- python 全栈开发,Day108(客户管理之权限控制,客户管理之动态"一级"菜单,其他应用使用rbac组件,django static文件的引入方式)
一.客户管理之权限控制 昨天的作业,有很多不完善的地方 下载代码,基本实现权限验证 https://github.com/987334176/luffy_permission/archive/v1.2 ...
- RESTful-rest_framework认证组件、权限组件、频率组件-第五篇
认证组件.权限组件.频率组件总结: 认证组件格式: 1 写一个认证类 from rest_framework.authentication import BaseAuthentication cla ...
- rbac组件
创建新项目 新建一个项目untitled,注意django 版本为1.11 修改models.py,增加2个表 from django.db import models class Classes(m ...
- CRM rbac 组件的应用
1 拷贝 rbac 组件到项目中,注册这个app 2 数据库迁移 1 删除rbac下migrations里除了init外的文件 2 修改用户表 class User(models.Model): &q ...
- 应用rbac组件 动态生成一级菜单
动态生成一级菜单 改表结构 需要知道是否是菜单\icon\名称权限表 +字段: is_menu = models.BooleanField(max_length=32,verbose_name='是否 ...
- CRM【第一篇】: 权限组件之权限控制
1. 问:为什么程序需要权限控制? 答:生活中的权限限制,① 看灾难片电影<2012>中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临:② 屌丝们,有没有想过为什么那些长得漂亮身 ...
- DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
- python 全栈开发,Day107(CRM初始,权限组件之权限控制,权限系统表设计)
一.CRM初始 CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销 ...
随机推荐
- bzoj 1042: [HAOI2008]硬币购物【容斥原理+dp】
当然是容斥啦. 用dp预处理出\( f[i] \),表示在\( i \)价格时不考虑限制的方案数,转移方程是\( f[i]+=f[i-c[j]] \),用状压枚举不满足的状态容斥一下即可. #incl ...
- (拓展欧几里得)51NOD 1256 乘法逆元
给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的. 输入 输入2个数M, N中间用空 ...
- ROS学习笔记六:xxx.launch文件详解
每当我们需要运行一个ROS节点或工具时,都需要打开一个新的终端运行一个命令.当系统中的节点数量不断增加时,每个节点一个终端的模式会变得非常麻烦.那么有没有一种方式可以一次性启动所有节点呢?答案当然是肯 ...
- 贪心 CodeForces 124B Permutations
题目传送门 /* 贪心:全排列函数使用,更新最值 */ #include <cstdio> #include <algorithm> #include <cstring& ...
- B - Archer
Problem description SmallR is an archer. SmallR is taking a match of archer with Zanoes. They try to ...
- 从0开始的hbase
2016马上要结束了,回顾一下这一年对hbase的学习历程. 1,年初hbase的状态 使用场景:主要是用来存储业务线的mysql表,增量同步到hbase,然后每天晚上全量导入hdfs做离线计算. h ...
- POI导出时,将指定的列设置为下拉列表
本示例设置第2列为下拉框(下拉框内容为:是/否),从第5行开始到5657行结束. 关键代码示例: ComboxList = new String[]{"是","否&quo ...
- bootstrap基本布局
中文API bootstrap.cn HTML5文档 类型 移动设备优先 width 属性控制设备的宽度.设置为 device-width 确保它能正确呈现在不同设备上. initial-sc ...
- 第一次阅读作业 xinzcover
---恢复内容开始--- 第一次阅读和准备作业 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1 这个作 ...
- Android 实现对多个EditText的监听
create_account=(EditText)findViewById(R.id.create_account); create_password=(EditText)findViewById(R ...