权限管理

权限管理是根据不同的用户有相应的权限功能,通常用到的权限管理理念Rbac.

Rbac

基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。

数据库表体现

在后端数据库rbac的表现是,一张用户表,一张职位表,还有一张权限表,用户多对多职位表,因为同一个人可能拥有多个职位,职位表多对多权限权限表,一个职位可拥有多个权限,权限在web的体现就是url地址,你必须有相对url的权限才能访问页面,从而限制你的功能

简单rbac表例子:

可以看出对于关于用户的增删改查功能的权限就是你能访问对应的url。例如boss职位我可以给他分配所有的权限,在职位权限表中可以看出boss拥有所有的权限。

如何实现

现在你可以给一个用户指定职位以及职位的权限,那么django中如何实现权限管理。首先你的知道django的运作流程,看下面的图:

用过django框架的很容易看懂这张图,简单来说流程如下:

  1. wsgiref模块负责接受和发送底层的socket消息
  2. 中间件为全局钩子对django的输入和输出进行操作
  3. 路由系统根据url执行相应的视图函数
  4. 视图函数调用数据库和模板语言渲染html文件返回给前段

所以我们可以自己写一个中间件来实现权限管理

实现原理分析

登录后要做的事:

  1. 登录成功后从数据库中获取当前用户的所有权限,也就是所有的url地址
  2. 利用session的特点将登录用户的所有url地址以键值对的形式保存

写一个中间件实现以下功能:

  1. 除了访问白名单中的url,都必须校验权限
  2. 根据请求的session判断当前用户的权限即获取能访问得url,没有登录则获取不到
  3. 校验通过则运行执行django下一步流程
  4. 校验不通过则返回没有权限提示,或返回登录页面

具体实现

数据库

from django.db import models

# Create your models here.
class Permission(models.Model):
title = models.CharField(max_length=22)
url = models.CharField(max_length=32) def __str__(self):
return self.title
class Meta:
verbose_name ='权限'
verbose_name_plural=verbose_name class UserInfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
roles = models.ManyToManyField(to='Role')
class Meta:
verbose_name ='用户'
verbose_name_plural=verbose_name
def __str__(self):
return self.username class Role(models.Model):
title = models.CharField(max_length=32)
permissions =models.ManyToManyField(to='Permission',null=True,blank=True)
class Meta:
verbose_name ='角色'
verbose_name_plural=verbose_name
def __str__(self):
return self.title

登录校验的中间件

from django.utils.deprecation import MiddlewareMixin
import re
from django.shortcuts import redirect
class ValidLogin(MiddlewareMixin):
def process_request(self,request):
# 获取当前请求的url
now_url = request.path_info
wirte_url = ['admin/.*','login/']
print(now_url)
for url in wirte_url:
if re.match(r'^/{}$'.format(url),now_url):
print('白名单通过')
return
if request.session.get('user',''):
print(request.session.get('user',''))
print('已经登录')
return
else:
next_url = '/login/?next='+now_url
print(next_url)
return redirect(next_url)

登录视图

from django.shortcuts import render,HttpResponse,redirect
from django.http import JsonResponse # Create your views here.
from rbac.models import UserInfo,Permission,Role def login(request):
ret = {'ret':0}
#获取因权限不足跳转到登录页面的原url,获取不到默认/customer/list/
next_url = request.GET.get('next','/customer/list/')
if request.method=='POST':
#post请求,获取前端发送的账号和密码
name = request.POST.get('email')
pwd = request.POST.get('pwd')
#根据获取到的账号密码去数据库筛选
user_obj = UserInfo.objects.filter(username=name,password=pwd).first()
if user_obj:
ret={'ret':1}
ret['url']=next_url
# 如果筛选成功则跨边将用户所有的权限url取出来
permission_queryset = user_obj.roles.all().filter(permissions__isnull=False).values_list('permissions__url')
#利用生成器保存url
permission_list = [i[0] for i in permission_queryset]
#设置到session中
request.session['permission_list'] = permission_list
else:
ret['msg']='账号密码错误'
return JsonResponse(ret)
#如果是get请求直接返回页面
return render(request,'login.html') def logout(request):
request.session.flush()
return redirect('login')

中间件

class RBACMiddleware(MiddlewareMixin):
def process_request(self, request):
#白名单url
wirte_url = [reverse('login'),reverse('logout')]
#获取当前的url
current_url = request.path_info
print('当前url',current_url)
#如果当前请求的url是白名单的url直接放行:
for url in wirte_url:
if re.match(r'^{}$'.format(url),current_url):
print('白名单通过')
return
#否则判断当前请求url是否在当前登录的用户的权限url中
#获取session中保存的用户权限url表
permission_list = request.session.get('permission_list',[])
for url in permission_list:
if re.match(r'^{}$'.format(url),current_url):
print(permission_list)
print('权限通过')
return
else:
return HttpResponse('没有权限')

Django实现Rbac权限管理的更多相关文章

  1. 十二、基于Django实现RBAC权限管理

    一.RBAC概述 RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后给用户划分角色. 从企业的角度来说,基本上是按照角色来划分职能.比如,CEO ...

  2. RBAC权限管理模型 产品经理 设计

    RBAC权限管理模型:基本模型及角色模型解析及举例 | 人人都是产品经理http://www.woshipm.com/pd/440765.html RBAC权限管理 - PainsOnline的专栏 ...

  3. Spring Security实现RBAC权限管理

    Spring Security实现RBAC权限管理 一.简介 在企业应用中,认证和授权是非常重要的一部分内容,业界最出名的两个框架就是大名鼎鼎的 Shiro和Spring Security.由于Spr ...

  4. yii2 rbac权限管理学习笔记

    下面介绍一个 yii2 的 Rbac 权限管理设置,闲话少说,直接上代码, 1.首先我们要在组件里面配置一下 Rbac ,如下所示(common/config/main-local.php或者main ...

  5. vue基于d2-admin的RBAC权限管理解决方案

    前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了. vue权限路由实现方式总结 vue权限路由实现方式总结二 选择d2-admin是因为element-ui的相关开源项目里,d2-a ...

  6. ThinkPHP中RBAC权限管理的简单应用

    RBAC英文全称(Role-Based Access Controller)即基于角色的权限访问控制,简单来讲,一个用户可以拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授 ...

  7. PHP中RBAC权限管理

    1.RBAC概念和原理          RBAC:全称叫做Role-Based Access Control,中文翻译叫做基于角色的访问控制.其主要的作用是实现项目的权限控制.            ...

  8. 基于RBAC权限管理的后台管理系统

    在摸爬滚打中渐渐理解了RBAC权限管理是个什么玩意. RBAC的基本概念: **RBAC认为权限授权实际上是Who.What.How的问题.在RBAC模型中,who.what.how构成了访问权限三元 ...

  9. spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)

    一,用数据库实现权限管理要注意哪些环节? 1,需要生成spring security中user类的派生类,用来保存用户id和昵称等信息, 避免页面上显示用户昵称时需要查数据库 2,如果需要在页面上显示 ...

随机推荐

  1. .NET 通过entity framework报数据库连接错误:ORA-01017: invalid username/password; logon denied

    如题,答案为:[ORA-01017].NET程序连接数据库失败 转载文章内容如下: 遇到问题 使用 C#/.NET 开发的一个客户端程序,需要连接 ORACLE 数据库,使用 Oracle.Manag ...

  2. 生成ssh公钥

    部分内容参考:http://git.mydoc.io/?t=154712 1.在电脑桌面上右键,选择git Base here 2.生成ssh公钥 ssh-keygen -t rsa -C" ...

  3. C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步)

    前几天碰到一个线程的顺序执行的问题,就是一个异步线程往A接口发送一个数据请求.另外一个异步线程往B接口发送一个数据请求,当A和B都执行成功了,再往C接口发送一个请求.说真的,一直做BS项目,对线程了解 ...

  4. JVM-Java内存区域

    JVM虚拟机运行时数据区结构分为: 其中方法区和堆是所有线程共享的内存区域,而Java栈.本地方法栈.程序计数器是线程私有的. 我们详细介绍运行时数据区的各个区域及其作用. 程序计数器: 一块较小的内 ...

  5. DIY——自制吸烟仪

    起因: 计划开始学电路相关知识,学习过程肯定离不开电烙铁,毕竟是在家弄,烟雾味道太大而且有毒.去某宝上搜一搜,一个吸烟仪动辄就得80 90米,就一个风扇一根管子一个壳子这个价格太贵了. 正好之前主机上 ...

  6. Windows Community Toolkit 3.0 - InfiniteCanvas

    概述 InfiniteCanvas 是一个 Canvas 控件,它支持无限画布的滚动,支持 Ink,文本,格式文本,画布缩放操作,撤销重做操作,导入和导出数据. 这是一个非常实用的控件,在“来画视频” ...

  7. 语法设计——基于LL(1)文法的预测分析表法

    实验二.语法设计--基于LL(1)文法的预测分析表法 一.实验目的 通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证.通过对 ...

  8. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 对外不要提供Delete方法加强软件的安全性

    1:软件系统一般不怕外面的人,最怕有内鬼.2:软件系统不怕一万,就怕万一,最好不要对外有漏洞,能不提供Delete方法就不提供.3:特别是不要有能远程调用的Delete方法,那就是出了事情都无法找到是 ...

  9. H5 标签选择器

    08-标签选择器 我是段落 我是段落 我是段落 我是段落 我是段落 我是标题 <!DOCTYPE html> <html lang="en"> <he ...

  10. js总结:对于字符串的切割截取和合并

    1.函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=str.split(”|”); //arr是一个包 ...