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技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销 ...
随机推荐
- java 学习书籍
<Effective java> <深入理解java虚拟机> <Java并发编程实践> <Java Performance> <java解惑> ...
- bootmanager is missing
问题描述: 在计算机管理->存储->磁盘管理中,因误操作,将D盘设置了"将分区标记为活动分区(M)",导致重启时无法无法进入系统,提示"bootmanager ...
- C#关于html颜色值的转化 ColorTranslator
//颜色转换非常重要快速的转换类. ColorTranslator.FromHtml (); //从html字符串得到颜色 ColorTranslator.ToHtml();
- 转 ORACLE-016:ora-01720 授权选项对于'xxxx'不存在
报错的情形如下, A用户:视图V_A B用户:视图V_B,并且用到了V_A C用户:需要用V_B, 授权过程, A用户下: grant select on V_A to B B用户下: grant s ...
- vijos P1426兴奋剂检查 多维费用背包问题的hash
https://vijos.org/p/1426 这是个好题,容易想到用dp[i][v1][v2][v3][v4][v5]表示在前i个物品中,各种东西的容量是那个的时候,能产生的最大价值. 时间不会T ...
- ambari-server启动WARN qtp-ambari-client-87] ServletHandler: 563 /api/v1/stacks/HDP/versions/2.4/recommendations java.lang.NullPointerException报错解决办法(图文详解)
问题详情 来源是,我在Ambari集群里,安装Hue. 给Ambari集群里安装可视化分析利器工具Hue步骤(图文详解 所遇到的这个问题. 然后,去ambari-server的log日志,查看,如 ...
- 一个iOS开发者的修真之路
在微信上有童鞋问我iOS开发者的入门标准是神马?这个问题难到我了,而且贸然给一个答案出来的话,必定会有万千高手来喷. 凡人修仙,仙人修道,道人修真.当我们还是一个在青石板上蹲马步汗水涔涔的废柴时,或许 ...
- AJPFX总结泛型概念和使用
泛型泛型(generic)概述和基本使用 泛型把明确数据类型的操作放到创建对象或者调用方法的时候再明确. J ...
- jquery 实现 点击把数据移动右侧 点击再次移回到左侧
2018年第一发 希望新的一年和大家一下学习更多知识 JS://把数据左边挪到了右边,再从右边移动回来function moveOption(e1, e2){ $("#" ...
- 简洁大方的wordpress主题,不容错过的主题,附带主题源码下载
cu主题是由疯狂的大叔设计,界面简洁大方是它最大的特点之一. 手残君也比较喜爱这款主题,在使用的过程中,根据手残君的个人习惯,对其进行了优化. 标题优化 标题居中显示 增加标题div背景色 标题div ...