1、rbac权限组件-初识, 中间件校验1

1、权限组件rbac

1、什么是权限

1 项目与应用

2 什么是权限?

一个包含正则表达式url就是一个权限

who what how ---------->True or Flase

 

2、版本1:用户表与权限url表 对应关系

    # 版本1UserInforname       pwdpermission=models.manytomany(Permission)name   pwd    egon   123            alex   456    A      111B      222C      333D      444Permissionurl=.....title=....id       url            title1     "/users/"         "查看用户"2     "/users/add/"     "添加用户"3    "/customer/add"    "添加客户"UserInfor_permissioniduser_idpermission_id        id    user_id   permission_id1       1           1        2       1           23       2           24       3           15       3           26       3           34       4           15       4           26       4          34       5           15       5           26       5           34       6           15       6           26       6           34       7           15       7           26       7           3

 

 

    示例:登录人:egon访问url:http://127.0.0.1:8000/users/    
         def users(request):user_id=request.session.get("user_id")obj=UserInfor.objects.filter(pk=user_id).first()obj.permission.all().valuelist("url")return HttpResponse("users.....")

 

3、版本2: 用户--》角色--》权限

    UserInforname       pwdrolesname   pwd    egon   123            alex   456    alex   456    alex   456    alex   456    alex   456    alex   456    alex   456    alex   456    Roletitle=.......       permissions=......id   title1   销售员UserInfor2Roleid     user_id    role_id    1        1          1Permissionurl=.....title=....id       url            title1     "/users/"         "查看用户"2     "/users/add/"     "添加用户"3    "/customer/add"    "添加客户"Role2Permissionid  role_id   permission_id    1      1           12      1           23      1           33  rbac(role-based access control) 

 

2、代码实现

1)项目目录结构

2)数据库表

from django.db import models# Create your models here.class User(models.Model):name = models.CharField(max_length=32)pwd = models.CharField(max_length=32)roles = models.ManyToManyField(to='Role')def __str__(self):return self.nameclass Role(models.Model):title = models.CharField(max_length=32)permissions = models.ManyToManyField(to="Permission")def __str__(self):return self.titleclass Permission(models.Model):title = models.CharField(max_length=32)url = models.CharField(max_length=32)def __str__(self):return self.title

 

 3)admin添加数据

创建超级用户 alex

 

 注册数据表

 

from django.contrib import admin# Register your models here.from .models import *admin.site.register(User)
admin.site.register(Role)
admin.site.register(Permission)

 

 

 3、登录验证

1、session中注册用户,权限

1.在session中注册用户ID
request.session['user_id'] = user.pk

2.初始化 permission_list 并注册到session 中
initial_session(user,request)


注意点:

permission = user.roles.all().values('permission__url').distinct()
1.values:      
temp = []
for role in user.roles.all(): # < QuerySet[ < Role: 保洁 >, < Role: 销售 >] >
temp.append({
'title':role.title
'permission__url': role.permission__url.all()
})
return temp

2.values 不会去重!!
<QuerySet [{'title': '保洁', 'permission__url': '/users/'},
{'title': '销售', 'permission__url': '/users/'},
{'title': '销售', 'permission__url': '/users/add'}]>

2、解耦

 

 

def initial_session(request,user):permissions = user.roles.all().values("permissions__url").distinct()permission_list = []for item in permissions:permission_list.append(item['permissions__url'])print(permission_list)  # ['/users/', '/users/add', '/users/delete/(\\d+)', '/users/edit/(\\d+)']
request.session["permission_list"] = permission_list"""values :for role in user.roles.all():   # <QuerySet [<Role: 保洁>, <Role: 销售>]>temp.append({"title":role.title,"permissions_url":role.permissions.all()})# <QuerySet [{'title': '保洁', 'permissions__url': '/users/'},# {'title': '销售', 'permissions__url': '/users/'},# {'title': '销售', 'permissions__url': '/users/add'}]>"""

 

 

 

 

4、基于中间件的权限校验

1、middleware如何构造?抄袭

 

 

 

 

2、正则匹配

from django.test import TestCase# Create your tests here.# 当前path 如何与 paths匹配
# 不能用in   /users/delete/9
# 正则匹配
li = ['/users/', '/users/add', '/users/delete/(\\d+)', '/users/edit/(\\d+)']c_path = "/users/delete/9"import reflag = Falsefor permission in li:permission = "^%s$" % permissionret = re.match(permission, c_path)if ret:flag = Truebreakif flag:print("success")# ret = re.match("/users/", "/users/delete/9")
ret = re.match("^/users/$", "/users/delete/9")
print(ret)

 

 

3、admin如何验证:302重定向 

 

 

3、构建中间件

 

# -*- coding: utf-8 -*-
# @Time    : 2018/08/11 0011 9:04
# @Author  : Venicidimport refrom django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirectclass ValidPermission(MiddlewareMixin):def process_request(self, request):# 当前访问路径current_path = request.path_info# 1、检验是否属于白名单  白名单,不需要任何权限的url# 正则匹配valid_url_list = ['/login/','/reg/','/admin/.*']for valid_url in valid_url_list:ret = re.match(valid_url, current_path)if ret:return None# 2、校验是否登录user_id = request.session.get("user_id")if not user_id:return redirect('/login/')# 3、校验权限permission_list = request.session.get("permission_list",[])flag = Falsefor permission in permission_list:permission = "^%s$" % permissionret = re.match(permission, current_path)if ret:flag = Truebreakif not flag:return HttpResponse("没有访问权限")return None

 

 4、views视图,url

 

url

from django.contrib import admin
from django.urls import path,re_pathfrom app01 import viewsurlpatterns = [path('admin/', admin.site.urls),re_path(r'^users/$',views.users),re_path(r'^users/add/$',views.add_user),re_path(r'^roles/$',views.roles),re_path(r'^login/$',views.login),
]

 

views

from django.shortcuts import render, HttpResponse# Create your views here.from rbac.models import *def users(request):user_list = User.objects.all()return render(request, "users.html", locals())def add_user(request):"""permission_list = request.session["permission_list"]  # # ['/users/', '/users/add', '/users/delete/(\\d+)', '/users/edit/(\\d+)']current_path = request.path_infoflag = Falsefor permission in permission_list:permission = "^%s$"%permissionret = re.match(permission, current_path)if ret:flag = Truebreakif not flag:return  HttpResponse("没有访问权限")"""return HttpResponse('add user')def roles(request):role_list = Role.objects.all()print(role_list)# 方式2 middleware"""# 方式1permission_list = request.session["permission_list"]  # # ['/users/', '/users/add', '/users/delete/(\\d+)', '/users/edit/(\\d+)']current_path = request.path_infoflag = Falsefor permission in permission_list:permission = "^%s$"%permissionret = re.match(permission, current_path)if ret:flag = Truebreakif not flag:return  HttpResponse("没有访问权限")"""return render(request, "roles.html", locals())from rbac.service.perssions import *
def login(request):if request.method == "POST":user = request.POST.get("user")pwd = request.POST.get("pwd")user = User.objects.filter(name=user, pwd=pwd).first()if user:############## 在session中注册用户request.session['user_id'] = user.pk############# 在session中注册权限list# 查询当前登录用户的所有角色# ret = user.roles.all()# print(ret)   # <QuerySet [<Role: 保洁>, <Role: 销售>]># 查询当前登录用户的所有权限
initial_session(request, user)return HttpResponse("登录成功")return render(request, 'login.html', locals())

 

 

 5、注意点

注意点:

1.白名单,不需要任何权限的url
valid_url_list = ['/login/', '/reg/', '/admin/.*']
for valid_url in valid_url_list:
ret = re.match(valid_url, current_path)
if ret:
return

正则匹配

2.校验是否登录,
user_id = request.session.get('user_id')
if not user_id:
return redirect('/login/')

3.校验权限(^ $ / 正则)
permission_list = request.session.get('permission_list',[])

flag = False
for permission in permission_list:
# ['/users/', '/users/add/', '/users/edit/(\\d+)/', '/users/delete/(\\d+)/']
# 需要 ^ $ 限定!!
permission = "^%s$" % permission

# 正则
ret = re.match(permission, current_path)
if ret:
flag = True
break

if not flag:
return HttpResponse('无访问权限!')

4、总结:关于rbac

关于rbac: (1) 创建表关系:class User(models.Model):name=models.CharField(max_length=32)pwd=models.CharField(max_length=32)roles=models.ManyToManyField(to="Role")def __str__(self): return self.nameclass Role(models.Model):title=models.CharField(max_length=32)permissions=models.ManyToManyField(to="Permission")def __str__(self): return self.titleclass Permission(models.Model):title=models.CharField(max_length=32)url=models.CharField(max_length=32)def __str__(self):return self.title(2) 基于admin录入数据(3) 登录校验:if 登录成功:查询当前登录用户的权限列表注册到session中(4) 校验权限(中间件的应用)class ValidPermission(MiddlewareMixin):def process_request(self,request):# 当前访问路径current_path = request.path_info# 检查是否属于白名单valid_url_list=["/login/","/reg/","/admin/.*"]for valid_url in valid_url_list:ret=re.match(valid_url,current_path)if ret:return None# 校验是否登录
user_id=request.session.get("user_id")if not user_id:return redirect("/login/")# 校验权限permission_list = request.session.get("permission_list",[])  # ['/users/', '/users/add', '/users/delete/(\\d+)', 'users/edit/(\\d+)']
flag = Falsefor permission in permission_list:permission = "^%s$" % permissionret = re.match(permission, current_path)if ret:flag = Truebreakif not flag:return HttpResponse("没有访问权限!")return None

 

 

 

转载于:https://www.cnblogs.com/venicid/p/9458776.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现打印异常日志_老生常谈SpringAop日志收集与处理做的工具包

场景 :使用Spring Aop拦截参数日志目前大部分做法都基本上大同小异,不想日后每个项目工程都写一份这样的Aop拦截处理日志的代码,甚至代码侵入。我想知道一些相对重要的请求方法的请求参数,响应参数,请求头,以及内部耗时,方法是成功还是失败等等信息。发生错误时我也不知道执行到…

服务器128g内存显示64g,64g内存服务器

64g内存服务器 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。接口名称GetCloudPhoneServerModelsGetCloudPhoneServerModels功能描…

IOPLL动态重配

连接 Avalon -MM接口 mgmt_waitrequest:当 PLL 重配置进程开始后&#xff0c;此端口变高并在 PLL 重配置期间保持高电平。 PLL 重配置进程完成后&#xff0c;此端口变低。 I/O PLL重配写操作步骤&#xff1a; 1、 为mgmt_address和mgmt_writedata设置有效值&#xff0c;并且…

qt中如何模拟按钮点击_如何快速在 Shopify 中加入按钮

假如你会 CSS , HTML , JS 三件套&#xff0c;那么修改 Shopify 代码将不会太难&#xff08;毕竟一个模板中的代码量还是挺多的&#xff0c;除非深入研究了代码&#xff0c;不然改起来还是会比较麻烦的&#xff09;。但挺多玩家是不会这三件套的&#xff0c;修改代码来达到添加…

浅谈关于java中的深浅拷贝

一.浅拷贝(shallow copy) 1.如何实现浅拷贝? Object类 是所有类的直接或间接父类,Object中存在clone方法,如下 protected native Object clone() throws CloneNotSupportedException; 如果想要使一个类的对象能够调用clone方法 ,则需要实现Cloneable接口, 并重写 clone方法: p…

iOS开发-Protocol协议及委托代理(Delegate)传值

前言&#xff1a;因为Object&#xff0d;C是不支持多继承的&#xff0c;所以很多时候都是用Protocol&#xff08;协议&#xff09;来代替。Protocol&#xff08;协议&#xff09;只能定义公用的一套接口&#xff0c;但不能提供具体的实现方法。也就是说&#xff0c;它只告诉你要…

git 查看分支编码_12个常用的Git命令,赶紧记一波!

今天齐姐简单讲下 Git 的实现原理&#xff0c;知其所以然才能知其然&#xff1b;并且梳理了日常最常用的 12 个命令&#xff0c;分为三大类分享给你。本文的结构如下&#xff1a;作者和开发原由Git 的数据模型常用命令资源推荐作者和开发原由Talk is cheap. Show me the code.这…

会做饭的机器人曰记_颜真卿《麻姑仙坛记》:苍劲古朴,体态沉雄,气象宏大...

《麻姑仙坛记》&#xff0c;全称《有唐抚州南城县麻姑山仙坛记》&#xff0c;或称《麻姑山仙坛记》。颜真卿撰并书于大历六年&#xff08;771&#xff09;四月。此碑有大、中、小三种刻本&#xff0c;且原石均佚&#xff0c;原拓佳本亦难得。大字本&#xff0c;字径约5厘米&…

Metro UI 菜单(Winform)

我有个项目需要要到菜单导航&#xff0c;就自己动作做了一个&#xff0c;感觉还可以&#xff0c;分享给大家。下载地址:http://files.cnblogs.com/files/dyj057/MetroUIMenu.zip 主要代码&#xff1a; private void SetElements(){if (Elements null) return;int eWidth Bord…

echarts 山东地图_用Python画中国地图,实现各省份数据可视化

第一步&#xff1a;安装pyechartspyecharts是一款将python与echarts结合的强大的数据可视化工具&#xff0c;本文使用了0.1.9.4版本pip install pyecharts0.1.9.4第二步&#xff1a;读取数据我的数据是在Excel表格里&#xff0c;如下图&#xff1a;Execel数据使用xlrd(没有就通…

mysql 中某个字段相同的数据拼接起来

2019独角兽企业重金招聘Python工程师标准>>> mysql> select name, GROUP_CONCAT( age SEPARATOR ‘#’) from student group by name; ——————————————————— | name | GROUP_CONCAT( age SEPARATOR ‘#’) | ———————————————…

微信红包系统架构的设计和优化分享

微信红包系统架构的设计和优化分享 编者按&#xff1a;经过2014年一年的酝酿&#xff0c;2015微信红包总量创下历史新高&#xff0c;峰值1400万次/秒&#xff0c;8.1亿次每分钟&#xff0c;微信红包收发达10.1亿次&#xff0c;系统整体运行平稳, 在这里我分享下微信红包背后的技…

FastDFS单机版安装教程

安装清单如下&#xff1a; 一、安装FastDFS 1. 安装libfastcommon 先解压安装包到目录 # unzip libfastcommon-1.0.36.zip 安装编译工具及环境&#xff08;后面Nginx也会用到这些依赖环境&#xff09; # yum -y install gcc gcc gcc-c openssl openssl-devel pcre pcre-deve #…

【原创】Chrome最新版(53-55)再次爆出BUG!

2019独角兽企业重金招聘Python工程师标准>>> 前言 今年十月份&#xff0c;我曾发布一篇文章《Chrome53 最新版惊现无厘头卡死 BUG&#xff01;》&#xff0c;不过那个BUG在最新的 Chrome 54 中已经修正。 而今天即将发布的Chrome弱智BUG&#xff1a; 仅 Chrome 53 -…

进程kswapd0与events/0消耗大量CPU的问题

http://www.nowamagic.net/librarys/veda/detail/2539 今天下午网站宕了两次机&#xff0c;发工单给阿里云&#xff0c;发现原因是服务器的CPU 100%了。 重启服务器后&#xff0c;使用 top 命令看看是哪些进程消耗那么大的 CPU 使用。盯了有好十几分钟&#xff0c;主要消耗 CPU…

跑三小时的monkey测试该怎么算_浅谈App测试(下)~带音频

文 | Vicky采编&#xff5c;Emily浅谈App测试(上)&#xff5e;带音频一、功能测试​二、性能测试(1)耗电量影响因素&#xff1a;定位、传感器、蓝牙&#xff0c;其中CPU、持续定位是两个平台造成耗电的主要因素。(2)流量也就是常说的耗流量&#xff0c;影响因素有重复请求&…

2016-2017-2 《Java程序设计》课程学生博客和代码托管链接

2016-2017-2 《Java程序设计》课程学生博客和代码托管链接 博客 1552 20155201 李卓雯20155202 张 旭20155203 杜可欣20155204 王 昊20155205 郝博雅20155206 赵 飞20155207 王雪纯20155208 徐子涵20155209 林虹宇20155210 潘滢昊20155211 解雪莹20155212 江振思20155213 陆忠民…

回顾一年的工作历程_【设备管理公司】召开20202021年度总结计划表彰暨工作述职会议...

点击上方蓝字关注我们2020年即将过去&#xff0c;为了总结2020年各项工作开展情况&#xff0c;同时做好2021年工作计划与部署&#xff0c;2020年12月30日-31日&#xff0c;设备管理公司组织召开了2020-2021年度总结计划表彰暨工作述职会议。公司领导、各部门经理、部门主管、车…

注册验证的时候一直出现的报错问题,终于解决了

今天再注册验证表单的时候一直报错&#xff0c;但是什么都没有改&#xff0c;就报错了&#xff0c;后面才知道原来是和我上次上传图片的时候&#xff0c;导入的2个js的顺序有关系的&#xff0c; 45行和41行互相换一下位置就好了 转载于:https://www.cnblogs.com/likeji/p/61433…

重排序

一、重排序。 1、为什么需要重排序&#xff1f; 现在的CPU一般采用流水线来执行指令。一个指令的执行被分成&#xff1a;取指、译码、访存、执行、写回、等若干个阶段。然后&#xff0c;多条指令可以同时存在于流水线中&#xff0c;同时被执行。 指令流水线并不是串行的&#x…