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. AXI_DMA IP学习

    参考:PG201  AXI DMA v7.1    AXI IP核 功能:一旦处理器配置好传输方式之后,DMA可以自己完成内存数据的搬进或者搬出,而不需要处理器的介入.如果使用方法得当,DMA可以显著 ...

  2. 使用ansible实现轻量级的批量主机管理

    作者:邓聪聪 查看ansible配置文件下的hosts的文件 [root@ansible-server scripts]# cat /etc/ansible/hosts [test] 172.16.1 ...

  3. linux环境变量问题

    在使用jenkins进行自动化部署的时候遇到一个问题,通过jenkins进行自动化部署的时候执行java命令时,提示java不知道是啥命令,确定是装好了java的,猜测是环境变量问题,但是在/etc/ ...

  4. C++多态、虚函数、纯虚函数、抽象类、虚基类

    一.C++多态 C++的多态包括静态多态和动态多态.静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态是指在编译期间就可以确定,动态多态是指在程序运行时才能确定. 二.虚函数 1.虚函数为类 ...

  5. Python爬虫基础之lxml

    一.Python lxml的基本应用 <html> <head> <title> The Dormouse's story </title> </ ...

  6. 【原创】beyond compare 解决文件一样,对比有差异的问题

    在beyond compare的5~6年的使用过程中突然有一天发现,beyond compare对比的文件都一样,但是却都显示红色!很是烦人. 这是因为beyond compare一开始对比的时时间, ...

  7. python的numpy库的学习

    1.创建 array(序列类型).asarray.arange.ones.ones_like.zeros.zeros_like.empty.empty_like.eye.identity 2.运算 两 ...

  8. 敏捷开发相关编辑思想(SOA、DDD、REST、CQRS)

    这是第一次写有关编程思想的东西. 1.理解Martin Fowler提出的SOA(面向服务歧义) 2.理解DDD(Domain-Driven Design领域驱动设计): http://blog.cs ...

  9. emacs Can't guess python-indent-offset, using defaults: 4

    首先,这只是一个提示,Emacs 在打开python 文件时,如果是个空文件,会有此提示. 在python.el文件配置中,有如下代码: Python.el (defcustom python-ind ...

  10. java-数组排序--插入排序

    插入排序 想象着你的左手拿着一手好牌[1,1,1,2,6,6,6,9,9],此时你从桌面上又抽出一张牌[1],你将抽出的牌,从又往左,依次与左手的牌进行比较(只以数字进行对比),当抽出的牌第一次不再大 ...