【django后端分离】rbac组件(文件源代码+使用)
1:用户,角色,权限,菜单表设计
from django.db import models # 用户菜单
class UserMenu(models.Model):
title = models.CharField(max_length=32, verbose_name='菜单')
icon = models.CharField(max_length=32, verbose_name='图标', null=True, blank=True) def __str__(self):
return self.title class Meta:
verbose_name = "菜单"
verbose_name_plural = verbose_name # 用户信息表
class UserInfo(models.Model):
username = models.CharField(unique=True, max_length=32, verbose_name="用户名")
password = models.CharField(max_length=64)
roles = models.ManyToManyField(to='Role', verbose_name='用户所拥有的角色', blank=True)
is_staff = models.BooleanField(default=True)
# admin配置
def __str__(self):
return self.username class Meta:
verbose_name = "用户信息"
verbose_name_plural = verbose_name # 角色表
class Role(models.Model):
name = models.CharField(max_length=32, verbose_name='角色名称')
permissions = models.ManyToManyField(to='Permission', verbose_name='角色所拥有的权限', blank=True) def __str__(self):
return self.name # 权限表
class Permission(models.Model):
title = models.CharField(max_length=32, verbose_name='权限名')
url = models.CharField(max_length=32, verbose_name='权限')
menu = models.ForeignKey("UserMenu", on_delete=models.CASCADE, null=True)
name = models.CharField(max_length=32, verbose_name='url别名', default="") class Meta:
verbose_name_plural = '权限表'
verbose_name = '权限表' def __str__(self):
return self.title
models
2:rbac.py
from dal.models import Role def initial_sesson(user,request):
"""
功能:将当前登录人的所有权限录入session中
:param user: 当前登录人
"""
# 查询当前登录人的所有权限列表
# 查看当前登录人的所有角色
# ret=Role.objects.filter(user=user)
permissions = Role.objects.filter(userinfo__username=user).values("permissions__url",
"permissions__title",
"permissions__name",
"permissions__menu__title",
"permissions__menu__icon",
"permissions__menu__pk").distinct()
# print("permissions",permissions) permission_list = []
permission_names = []
permission_menu_dict ={} for item in permissions:
# 构建权限列表
permission_list.append(item["permissions__url"])
permission_names.append(item["permissions__name"]) # 菜单权限
menu_pk=item["permissions__menu__pk"]
if menu_pk: if menu_pk not in permission_menu_dict: permission_menu_dict[menu_pk]={
"menu_title":item["permissions__menu__title"],
"menu_icon":item["permissions__menu__icon"],
"children":[
{
"title":item["permissions__title"],
"url":item["permissions__url"],
}
], }
else:
permission_menu_dict[menu_pk]["children"].append({
"title": item["permissions__title"],
"url": item["permissions__url"],
}) # print("permission_menu_dict",permission_menu_dict) # 将当前登录人的权限列表注入session中
request.session["permission_list"] = permission_list
request.session["permission_names"] = permission_names
# 将当前登录人的菜单权限字典注入session中
request.session["permission_menu_dict"] = permission_menu_dict
return permission_menu_dict
3:middlewares.py中间件验证权限文件
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect
import re
from django.http import JsonResponse class PermissionMiddleWare(MiddlewareMixin): def process_request(self,request): print("permission_list的值是:",request.session.get("permission_list"))
current_path = request.path
message = {}
# 设置白名单放行
for reg in ["/user/login","/admin/*"]:
ret=re.search(reg,current_path)
if ret:
return None
# /customers/edit/1 try:
# 校验权限
permission_list=request.session.get("permission_list") for reg in permission_list:
reg="^%s$"%reg
ret=re.search(reg,current_path)
if ret:
return None message['message'] = "提示:无访问权限"
message['code'] = 404
return JsonResponse(message)
except Exception as e:
print(e)
message['message'] = "提示:无访问权限"
message['code'] = 404
return JsonResponse(message)
4:中间件配置与登录视图的配置
# settings.py MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'user.rbac_utils.middlewares.PermissionMiddleWare', # 配置中间件
] # 登录函数的配置: 这里只是写关于权限配置的部分函数,其余的token需求自己写 # 保存登录用户状态信息
request.session["user_id"] = user_obj.pk
# 录入权限session
permission_menu_dict = initial_sesson(username, request)
# 设置返回给前端的值
csrf = {}
csrf['permission_menu_dict'] = permission_menu_dict
csrf['token'] = token
return JsonResponse(csrf)
【django后端分离】rbac组件(文件源代码+使用)的更多相关文章
- springBoot 搭建web项目(前后端分离,附项目源代码地址)
springBoot 搭建web项目(前后端分离,附项目源代码地址) 概述 该项目包含springBoot-example-ui 和 springBoot-example,分别为前端与后端,前后端 ...
- 前后端分离跨服务器文件上传-Java SpringMVC版
近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码. 一.Tomcat服务器部分 1.Tomcat服务器 单独复制一 ...
- 模组 前后端分离CURD 组件
js (function () { // {# -------------------------------------------------------------------------- # ...
- netcore3.1 + vue (前后端分离) ElementUI多文件带参数上传
vue前端代码 前端主要使用了ElementUI的el-uploda插件,除去业务代码需要注意的是使用formdata存储片上传时所需的参数 <el-upload class="upl ...
- 【django后端分离】Django Rest Framework之认证系统之redis数据库的token认证(token过期时间)
1:登录视图 redis_cli.py文件: import redis Pool= redis.ConnectionPool(host='localhost',port=6379,decode_res ...
- 【django后端分离】Django Rest Framework之一般配置(简单剖析)
1:常设状态码 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent). 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成 ...
- 【django后端分离】mysql原生查询命令后,RawQueryset类型的自定义序列化返回json格式
1:设置mysql原生分页 # 监控系统首页显示分页 def MyPagination(limitid,offsetid): limitid =str(limitid) offsetid =str(o ...
- 前后端分离ueditor富文本编辑器的使用-Java版本
最近在写一个自己的后台管理系统(主要是写着玩的,用来熟悉后端java的知识,目前只是会简单的写点接口),想在项目中编写一个发布新闻文章的功能,想到了使用百度的ueditor富文本编辑器,网上找了很多j ...
- python 全栈开发,Day108(客户管理之权限控制,客户管理之动态"一级"菜单,其他应用使用rbac组件,django static文件的引入方式)
一.客户管理之权限控制 昨天的作业,有很多不完善的地方 下载代码,基本实现权限验证 https://github.com/987334176/luffy_permission/archive/v1.2 ...
随机推荐
- Salesforce学习之路-developer篇(五)Aura组件原理及常用属性
很喜欢曾经看到的一句话:以输出倒逼输入.以输出的形式强制自己学习,确实是高效的学习方式,真的很棒.以下仅为个人学习理解,如有错误,欢迎指出,共同学习. 1. 什么是Lightning Componen ...
- 算法编程题积累(3)——腾讯笔试"构造回文“问题
首先理解题意,回文串的特点:倒序后跟原串相同.故而可以将原串看成向一个回文串在任意位置添加任意字符后形成的字符串,也就是说原串中存在一段未必连续的回文序列. 通过分析可以知道AC本题的核心思路:求出回 ...
- python习题——随机整数生成类
随机整数生成类 可以先设定一批生成数字的个数,可设定指定生成的数值的范围 1.普通类实现 import random import random class RandomGen: def __init ...
- python手册学习笔记3
笔记3 > http://www.pythondoc.com/pythontutorial3/datastructures.html 装饰器 def log(text): def decorat ...
- jquery判断手指滑动方向
jquery判断手指滑动方向 <pre> /*判断哪个滑动方向还是自己改下 要么上下 要么左右*/ var startX; var startY; $(".shanghua&qu ...
- Ember.js和Vue.js对比,哪个框架更优秀?
本文由葡萄城技术团队于博客园翻译并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. JavaScript最初是为Web应用程序创建的.但是随着前端技术的 ...
- Linux命令实战(二)
1.printf格式化输出(format and print data) 语法:printf(选项)(参数) 参数 输出格式:指定数据输出时的格式: 输出字符串:指定要输出的数据. 格式替代符 %c ...
- Python 基础 三 反射
Python 基础 三 反射 今天我们先介绍一下反射这个概念,啥是反射?反射就是自己检测自己.在我们Python的面向对象中的反射是啥意思呢?就是通过字符串的形式操作对象相关的属性.python中的一 ...
- 如何对 React 函数式组件进行优化
文章首发个人博客 前言 目的 本文只介绍函数式组件特有的性能优化方式,类组件和函数式组件都有的不介绍,比如 key 的使用.另外本文不详细的介绍 API 的使用,后面也许会写,其实想用好 hooks ...
- nyoj 244-16进制的简单运算 (scanf("%x%c%x", &a, &b, &c); printf("%o", a ± b))
244-16进制的简单运算 内存限制:64MB 时间限制:1000ms 特判: No 通过数:12 提交数:13 难度:1 题目描述: 现在给你一个16进制的加减法的表达式,要求用8进制输出表达式的结 ...