1、权限组件rbac

1、什么是权限

1 项目与应用

2 什么是权限?

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

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

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

    # 版本1

     UserInfor

         name
pwd
permission=models.manytomany(Permission) name pwd
egon
alex
A
B
C
D Permission url=.....
title=.... id url title
"/users/" "查看用户"
"/users/add/" "添加用户"
"/customer/add" "添加客户" UserInfor_permission id
user_id
permission_id id user_id permission_id
    示例:登录人: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: 用户--》角色--》权限

    UserInfor

         name
pwd
roles name pwd
egon
alex
alex
alex
alex
alex
alex
alex
alex Role title=.......
permissions=...... id title
销售员 UserInfor2Role id user_id role_id Permission url=.....
title=.... id url title
"/users/" "查看用户"
"/users/add/" "添加用户"
"/customer/add" "添加客户" Role2Permission id role_id permission_id 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.name class Role(models.Model):
title = models.CharField(max_length=32)
permissions = models.ManyToManyField(to="Permission") def __str__(self):
return self.title class 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 re flag = False for permission in li:
permission = "^%s$" % permission
ret = re.match(permission, c_path)
if ret:
flag = True
break if 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 : Venicid import re from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirect class 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 = False
for permission in permission_list:
permission = "^%s$" % permission
ret = re.match(permission, current_path)
if ret:
flag = True
break if not flag:
return HttpResponse("没有访问权限")
return None

4、views视图,url

url

from django.contrib import admin
from django.urls import path,re_path from app01 import views urlpatterns = [
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_info flag = False
for permission in permission_list:
permission = "^%s$"%permission
ret = re.match(permission, current_path)
if ret:
flag = True
break if not flag:
return HttpResponse("没有访问权限")
"""
return HttpResponse('add user') def roles(request):
role_list = Role.objects.all()
print(role_list) # 方式2 middleware """
# 方式1
permission_list = request.session["permission_list"] # # ['/users/', '/users/add', '/users/delete/(\\d+)', '/users/edit/(\\d+)']
current_path = request.path_info flag = False
for permission in permission_list:
permission = "^%s$"%permission
ret = re.match(permission, current_path)
if ret:
flag = True
break if 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.name class Role(models.Model):
title=models.CharField(max_length=32)
permissions=models.ManyToManyField(to="Permission") def __str__(self): return self.title class 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 = False
for permission in permission_list: permission = "^%s$" % permission ret = re.match(permission, current_path)
if ret:
flag = True
break
if not flag:
return HttpResponse("没有访问权限!") return None

1、rbac权限组件-初识, 中间件校验1的更多相关文章

  1. rbac权限组件整合到实际项目的全过程详述

    rbac简介 项目的GitHub地址 欢迎Download&Fork&Star:https://github.com/Wanghongw/CombineRbac 另外,本文只简单介绍一 ...

  2. CRM项目之RBAC权限组件-day26

    写在前面 上课第26天,打卡: 世间安得双全法 不负如来不负卿 s17day26 CRM项目 项目概要:XX公司CRM - 权限管理,公共组件,app ***** - 熟悉增删改查,Low *** - ...

  3. django自定义rbac权限组件(二级菜单)

    一.目录结构 二.表结构设计 model.py from django.db import models # Create your models here. class Menu(models.Mo ...

  4. Django-CRM项目学习(六)-rbac模块(权限组件)

    1.rbac权限组件 1.1 模板分析(五表结构) 1.2 模板构建 人物和角色进行多对多绑定,角色与权限进行多对多绑定.其中人物和角色的多对多绑定的操作可以避免相同的人物多重权限的操作. 1.3 数 ...

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

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

  6. 基于RBAC权限验证, 中间价middleware实现, views 登录视图代码

    废话不多说  上代码: 基础实现: rom django.shortcuts import HttpResponse, redirect, render from django.http import ...

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

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

  8. Django高级篇三。restful的解析器,认证组件,权限组件

    一.rest=framework之解析器 1)解析器作用. 根据提交的数据.只解析某些特定的数据.非法数据不接收,为了系统安全问题 比如解析的数据格式有 有application/json,x-www ...

  9. drf token刷新配置、认证组件(使用)、权限组件(使用)、频率组件(使用)、异常组件(使用)

    目录 一.特殊路由映射的请求 二.token刷新机制配置(了解) 三.认证组件项目使用:多方式登录 1.urls.py 路由 2.views.py 视图 3.serializers.py 序列化 4. ...

随机推荐

  1. 洛谷P1064 金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...

  2. [EXCEL] 不能清除剪贴板: We couldn't free up space on the clipboard. Another program might be using it right now

    Excel复制粘贴时出现以下错误,原因是有程序占用了剪切板. We couldn't free up space on the clipboard. Another program might be ...

  3. asp.net MVC 使用PagedList.MVC实现分页

    在上一篇的EF之DB First中,存在以下的两个问题: 1. 添加/编辑页面显示的是属性名称,而非自定义的名称(如:姓名.专业...) 2. 添加/编辑时没有加入验证 另外数据展示使用分页 @Htm ...

  4. [翻译] CotEditor

    CotEditor https://github.com/coteditor/CotEditor CotEditor is a lightweight plain-text editor for OS ...

  5. Spring中的统一异常处理方式

    源自:https://segmentfault.com/a/1190000016236188 在具体的SSM项目开发中,由于Controller层为处于请求处理的最顶层,再往上就是框架代码的. 因此, ...

  6. 【理解】 Error 10053和 Error 10054

    1. 10053 这个错误码的意思是:  A established connection was aborted by the software in your host machine, 一个已建 ...

  7. 解决Struts2 json-plugin Date或Timestamp等日期格式带T的问题

    如果没有对日期时间对象类进行json日期格式声明,会出现类似"2013-06-18T12:08:56.23"日期,在日期中间多出一个T字母: 从通过查询数据,以及调试程序发现直到返 ...

  8. [CEOI2017]Building Bridges

    题目 斜率优化思博题,不想写了 之后就一直\(95\)了,于是靠肮脏的打表 就是更新了一下凸壳上二分斜率的写法,非常清爽好写 就当是挂个板子了 #include<algorithm> #i ...

  9. Java基础加强之并发(三)Thread中start()和run()的区别

    Thread中start()和run()的区别 start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用.run()   : run()就和普通的成 ...

  10. 内存,缓存,cpu,硬盘关系

    RAM(random access memory)即随机存储内存,这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序.我把它叫耗电存储器 ROM(Read-Only Memory)即只 ...