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. C# - 设计模式 - 模板模式

    模板模式 问题场景 咖啡和茶派生于抽象类饮料,咖啡和茶都具有烧水的方法,所以可以将烧水的方法提取到抽象类饮料中去实现,而咖啡具有一个向杯子加咖啡粉的方法,茶具有一个向杯子加茶叶的方法,看起来两个方法是 ...

  2. springboot+mysql+mybatis+Mybatis-Generator+druid 项目demo

    1.使用idea新建项目 2.使用Mybatis-Generator自动生成Dao.Model.Mapping相关文件 3.配置application.yml文件 server: port: 8080 ...

  3. [Kubernetes]深入理解StatefulSet

    前面我写的一系列博客,如果你能够耐心看到这一篇,那你应该对一个概念就不是太陌生了:Deployment. 为什么提这个概念呢,这就要说到Deployment的一个不足了.Deployment不足以覆盖 ...

  4. shell 其他杂项知识点笔记

    // 其他杂项知识点 对于普通用户,Base shell 默认的提示符是美元符号$:对于超级用户(root 用户),Bash Shell 默认的提示符是井号# ------- \#!是一个约定的标记, ...

  5. C#获取指定的文件是否是内部特殊版本的代码

    把内容过程经常用到的内容片段珍藏起来,下面的内容内容是关于C#获取指定的文件是否是内部特殊版本的内容,希望对各朋友有所用处. using System;using System.Diagnostics ...

  6. 浅谈rest風格的接口开发

    简单描述:因为前后端分离,开发完模块之后,接到team leader的指令,我这个渣渣javaer需要给前端人员返回一个接口,具体内容是课程列表json和分类列表json.emmmm,第一次写接口,心 ...

  7. 修改MySQL的数据目录

    环境:CentOS Linux release 7.1.1503 (Core) 1. 安装MYSQL wget http://dev.mysql.com/get/mysql-community-rel ...

  8. 简单测试Elasticsearch 7.0

    发现不同的地方 1.创建index  (注意:7.0版本之前mappings中需要增加_doc,7.0版之后已去掉) PUT http://10.10.x.x:9200/test 2.Elastics ...

  9. status 返回当前请求的http状态码

    status属性返回当前请求的http状态码,此属性仅当数据发送并接收完毕后才可获取.完整的HTTP状态码如下: 100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分 101 ...

  10. CentOS7使用yum安装配置Redis

    >>>>>>>>>>>>>>>>>>>>>>>>> ...