rbac:基于角色的权限访问控制(Role-Based Access Control)。

rbac的主要流程:给每个角色赋予不同的权限,是这个角色的员工都有这个角色的所有权限。一个角色可以有多个人员担任,一个员工可以担任多个角色(比如部门经理、业务员等)。当员工成功登陆系统时,系统需要获取这个员工的多有权限,并放到一个列表里面。然后员工在访问每个权限url时,系统需要进行判断该员工有没有这个权限进行这项操作。如何判断?就是循环这个员工的所有权限,看有没有对应的权限。这里用到了re模块里面的match方法。

如下代码:

# 需要先登陆,拿到该员工的权限列表并去重
def login(request):
if request.method=="GET":
return render(request,"login.html") else:
user=request.POST.get("user")
pwd=request.POST.get("pwd")
user=UserInfo.objects.filter(name=user,pwd=pwd).first()
if user:
# 验证成功之后做什么?
request.session["user_id"]=user.pk # 设置session
# 当前登录用户的所有权限, distinct()是去掉重复的权限
permission_info=user.roles.all().values("permissions__url","permissions__title").distinct()
temp=[] # 该员工的全部权限url列表
for i in permission_info:
temp.append(i["permissions__url"])
request.session["permission_list"]=temp # {"user_id":1,"permission_list":['/users/','/orders/']}
return HttpResponse("登录成功!")
else:
return redirect("/login/")

登陆成功之后,判断查看用户操作权限

from django.shortcuts import HttpResponse

def users(request):
# //users/
current_path = request.path_info # 拿到访问的路径
permission_list = request.session.get("permission_list") # 取session,从session表里面取到这个员工的所有权限 ['/order/', '/users/']
if not permission_list: # 用户没有登陆,取不到权限列表
return HttpResponse("login.html")
# /users/edit/3 为什么要用正则,因为/users/edit/3 与/users/edit/(/d+)不能直接匹配
import re
flag = False # 加上标志位
for permission_url in permission_list:
ret = re.match(permission_url, current_path) # 用正则去匹配具体的路径,成功则返回对象, 否则返回None
if ret: # 如果返回对象
flag = True
break
if not flag:
return HttpResponse("没有访问权限") return HttpResponse("用户列表") # 有权限

接下来通过中间件来实现这个功能

再创建一个应用名字叫做rbac(当然也可以放到同一个应用里面),这个应用里面创建一个包service,包里创建一个名字为permission_li.py的文件。

from django.utils.deprecation import MiddlewareMixin

from django.shortcuts import  redirect,HttpResponse,render

class M1(MiddlewareMixin):
def process_request(self,request):
# //users/
current_path = request.path_info # 拿到访问的路径
permission_list = request.session.get("permission_list") # 从session表里面取到这个员工的所有权限 ['/order/', '/users/']
# /users/edit/3 为什么要用正则,因为/users/edit/3 与/users/edit/(/d+)不能直接匹配
import re
flag = False # 加上标志位
for permission_url in permission_list:
ret = re.match(permission_url, current_path) # 用正则去匹配具体的路径,成功则返回对象, 否则返回None
if ret: # 如果返回对象
flag = True
break
if not flag:
return HttpResponse("没有访问权限")

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',
'rbac.service.permission_li.M1', # 加在这里
]

接下来的问题就是,加上中间件之后,登陆页面也没有权限访问了。

我们添加白名单,登陆、注册和admin页面加里即可。

from django.utils.deprecation import MiddlewareMixin

from django.shortcuts import  redirect,HttpResponse,render

class M1(MiddlewareMixin):
def process_request(self,request):
pass #/admin/login/?next=/admin/
current_path = request.path_info valid_url_menu=["/login/","/reg/","/admin/.*"]
import re
for valid_url in valid_url_menu:
ret=re.match(valid_url,current_path)
if ret:
return None permission_list = request.session.get("permission_list")
if not permission_list:
return redirect("/login/")
# /users/edit/3
import re
flag = False
for permission_url in permission_list:
ret = re.match(permission_url, current_path)
if ret:
flag = True
break
if not flag:
return HttpResponse("没有权限")

权限组件之rbac的更多相关文章

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

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

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

    1.权限组件rbac 1.什么是权限 1 项目与应用 2 什么是权限? 一个包含正则表达式url就是一个权限 who what how ---------->True or Flase 2.版本 ...

  3. 权限组件(15):rbac的使用文档和在业务中的应用

    这里用主机管理系统当做示例. 一.将rbac组件拷贝到项目中. 注意: rbac自己的静态文件.layout.html(被继承的模板).bootstrap.fontsize.公共的css.jquery ...

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

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

  5. 权限系统与RBAC模型概述

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3793894.html ...

  6. 权限系统与RBAC模型概述[绝对经典]

    0. 前言 一年前,我负责的一个项目中需要权限管理.当时凭着自己的逻辑设计出了一套权限管理模型,基本原理与RBAC非常相似,只是过于简陋.当时google了一些权限管理的资料,从中了解到早就有了RBA ...

  7. [转]权限系统与RBAC模型概述[绝对经典]

    转自:https://blog.csdn.net/yangwenxue_admin/article/details/73936803 0. 前言 一年前,我负责的一个项目中需要权限管理.当时凭着自己的 ...

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

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

  9. Django - 权限分配、权限组件与CRM整合

    一.权限分配 需求:为用户分配角色,为角色分配权限,如下图效果: 1.视图代码: from django.shortcuts import render from django.http import ...

随机推荐

  1. 「JavaScript面向对象编程指南」基础

    DOM标准是独立的(即并不依赖JS)操作结构化文档的方式 BOM实际是个与浏览器有关的对象集合,原来没任何标准可言,H5诞生后才被定义了一些浏览器间通用的对象标准 ES5严格模式"use s ...

  2. expect 批量自动部署ssh 免密登陆 之 二

    #!/usr/bin/expect -f ########################################## hutu #Push the id.pas.pub public key ...

  3. 算法——八皇后问题(eight queen puzzle)之回溯法求解

    八皇后谜题是经典的一个问题,其解法一共有种! 其定义: 首先定义一个8*8的棋盘 我们有八个皇后在手里,目的是把八个都放在棋盘中 位于皇后的水平和垂直方向的棋格不能有其他皇后 位于皇后的斜对角线上的棋 ...

  4. 快速搭建Docker Registry私有仓库

    前提条件: 服务器已经安装Docker(我的服务器是CentOS 7) 服务器已经安装Docker Compose 满足以上条件时就可以开始搭建了: 1. 生成用户密码文件:(运行下面命令后会在当前目 ...

  5. c#操作Excel模板,替换命名单元格或关键字形成报表

    c#操作Excel模板,替换命名单元格或关键字形成报表 http://blog.sina.com.cn/s/blog_45eaa01a0102vqma.html一 建立Excel 模板文件 templ ...

  6. BeanUtils.copyProperties缓解代码压力,释放双手

    简单描述:之前在写代码的时候,经常把表单提交到后台的对象的参数,通过getter方法取出来,然后,再通过setter方法传递给需要的对象,代码中写了很多get set这种方法,后来听同事说,sprin ...

  7. Tomcat设置Windows下随系统自启

    一:确保tomcat 在点击bin\startup 文件可以正常启动访问: 二:本机安装有JDK: 三:本机环境变量配置:JAVA_HOME:C:\Java\jdk1.7.0_17; 四:本机Tomc ...

  8. [原创]Modelsim后仿真

    因调试需要,进行后仿真,ISE生成的sim文件和sdf文件 `timescale ns/ ps module lut_dly ( clkout, fpga_clk, config_in ); outp ...

  9. 微信域名检测的C#实现

     背景:最近公司的公众号域名被封了,原因是公司网站被黑后上传了一个不符合微信规范的网页.所以...就进入了微信域名解封的流程. 百度微信域名解封发现很多微信域名检测的网站,还有Api:但是本人做微信公 ...

  10. Gradle 下载的依赖包在什么位置?

    Mac系统默认下载到:/Users/(用户名)/.gradle/caches/modules-2/files-2.1Windows系统默认下载到:C:\Users\(用户名)\.gradle\cach ...