1、django的权限管理叫做RBAC

我们在百度上查看RBAC的概念如下

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

2、下面我们先来看下django的rbac该如何设计

首先我们要设计三张表,表1为用户表,表2为角色表,表3为权限表,用户表关联角色表,角色表关联权限表,用户属于某个角色,而某个角色可以包含一些权限,同样一个用户可以属于多个角色,而一个角色同样可以包含多个权限,下面我们看下我们的model中的设计

from django.db import models

# Create your models here.

class Userinfo(models.Model):
username = models.CharField(max_length=64)
uerpwd = models.CharField(max_length=64)
roles = models.ManyToManyField(to="Role") def __str__(self):
return self.username
class Meta:
verbose_name = "用户表"
verbose_name_plural = verbose_name class Role(models.Model):
title = models.CharField(max_length=64)
pers = models.ManyToManyField(to="per") def __str__(self):
return self.title
class Meta:
verbose_name="角色表"
verbose_name_plural = verbose_name class per(models.Model):
title = models.CharField(max_length=64)
url = models.CharField(max_length=128) def __str__(self):
return self.title
class Meta:
verbose_name = "权限表"

  

设计好表结构后,我们先往表中写数据,我们先看用户表中的数据

我们点开看下具体某个用户的角色信息

我们可以看到,用户test1有2个角色,角色1是CEO,角色2是销售角色

然后我们在看角色表

我们在看下某个角色具体的权限,我们这里定义权限就是操作库的权限,比如增删改查四个权限

我们可以看到CEO有4个权限,分别是增删改查4个权限

最后我们在看下权限表,通过权限表,我们就可以看到一共有4个权限

我们看下具体的权限的表内容,我们可以看到具体的权限就是一条url

从上面的数据库的设计,我们可以知道,控制url的访问就是控制权限

3、最后我们进入具体的代码的逻辑控制

我们思路是这样的,因为从上面我们可以看到,如果某个用户没有某个权限,那么我们就控制这个用户是否能访问这条url就可以了,那么我们怎么做呢?

思路1、可以写在视图函数中

思路2、可以写在视图函数的装饰器中

思路3、可以写在中间件中

我们可以考虑一下,哪种最好呢?当然是第三种最好,因为每个请求都会发一个request,如果这个用户没有这个方位这个url的权限,那么我们直接在中间件就把这个请求拦截就可以了,不需要让这个请求在往后走,占用我们的资源,您说对吗?

那么下面就看下具体的代码

用户首先要登陆,那么登陆后,我们就需要把用户信息存储到session中,同样,我们也需要从数据库中获取我这个用户的权限信息,然后存储到session中,以后我们就可以从session拿到我这次访问的用户和我这个用户所拥有的权限,以后我们中间件函数就从session中获取这次访问的用户信息

视图函数中的代码如下

def login(request):
if request.method == "GET":
return render(request, "rbac_login.html")
else:
name = request.POST.get("name")
pwd = request.POST.get("pwd") if rbacmodels.Userinfo.objects.filter(username=name,uerpwd=pwd).exists():
userobj = rbacmodels.Userinfo.objects.get(username=name) request.session["userid"] = userobj.id # print(userobj.roles.all())
obj = userobj.roles.all().values_list("pers__url").distinct()
per_list = []
for i in obj:
per_list.append(i[0])
request.session["per_list"] = per_list
print(per_list)
# request.session.flush()
# print(dir(request.session))
# print("=" * 120)
return redirect("/user/")
else:
return render(request, "rbac_login.html")

  

下面我们在看下中间件函数是怎么实现的

我们首先要搞一个白名单,如果url在这个白名单里,则可以直接访问,不用走后面的控制逻辑,因为比如login这类的url,你必须要放通他,如果你连login函数也拦截了,那么可以都无法登陆了

其次我们还要搞一个判断用户是否登陆的判断,如果客户没有登陆,则让他返回到登陆界面

最后,我们在写权限的控制逻辑,判断当前访问的url是否在权限列表中,如果在则通过,如果不在,则直接retrun回去,就达到了权限控制的需求了

from django.utils.deprecation import MiddlewareMixin
import re
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
from django.shortcuts import reverse class My_rbac_mid(MiddlewareMixin): def process_request(self,request):
current_path = request.path_info # 校验白名单 white_list = ["/login/","/admin/.*"]
for wh in white_list:
wh = "^" + wh + "$"
res = re.match(wh,current_path)
if res:
return None # 校验登陆
if request.session.get("userid"):
pass
else:
return redirect("/login/") # 校验权限
per_list = request.session.get("per_list",[])
flag = False
if per_list:
for per in per_list:
if flag == False:
obj = "^" + per + "$"
res = re.match(obj,current_path)
if res:
flag = True
break
else:
continue
if flag == False:
return HttpResponse("无权限访问")

  

4、最后我们看下html代码是如何渲染的,我们的目的是如果该用户没有这个权限,则连按钮都不让他看到

{% extends 'rbac_base.html' %}

{% block con %}

    <h4>用户列表</h4>

    {% if "/user/add/" in per_list %}
<a href="/user/add/" class="btn btn-primary">添加用户</a>
{% endif %} <table class="table table-bordered table-striped">
<thead>
<tr>
<th>序号</th>
<th>姓名</th>
<th>角色</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for user in user_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ user.username }}</td>
<td>
{% for role in user.roles.all %}
{% if forloop.last %}
{{ role.title }}
{% else %}
{{ role.title }}|
{% endif %}
{% endfor %} </td> <td>
{% if "/user/del/(\d+)" in per_list %}
<a href="/user/del/{{ user.id }}"><button type="button" class="btn btn-danger"><span class="glyphicon glyphicon-trash"></span>&nbsp删除</button></a>
{% endif %} {% if "/user/edit/(\d+)" in per_list %}
<a href="/user/edit/{{ user.id }}"><button type="button" class="btn btn-success"><span class="glyphicon glyphicon-pencil"></span>&nbsp编辑</button></a>
{% endif %}
</td>
</tr>
{% endfor %} </tbody>
</table> {% endblock %}

  

我将逻辑控制的地方截图出来,大家重点看下

如果有增加权限,则显示增加按钮

如果有删除权限,则显示删除按钮

如果有 编辑权限,则显示i编辑按钮

Django的Rbac介绍1的更多相关文章

  1. Django的Rbac介绍2

    上一篇博客我们记录了一下Django中使用Rbac,但是上一篇博客中的方法有一点不好,就是,因为我要在html文件中控制:如果用户有某个权限,则显示这个权限所代表的按钮,但是我现在只有1张表的增删改查 ...

  2. Django的Rbac介绍3

    今天的博客主要是记录一下如何实现左侧菜单,这里我们想实现的效果就是,如果用户有查看用户的权限,则显示查看用户的左侧菜单,如果用户有查看角色的权限,则显示查看角色的左侧菜单,如果两者都有,则需要显示两个 ...

  3. Django - Django框架 简单介绍

    Django框架 简单介绍 本文地址: http://blog.csdn.net/caroline_wendy/article/details/29172271 1. 介绍 Django是一个开放源码 ...

  4. Django项目结构介绍

    官网下载网址:https://www.djangoproject.com/download/ 安装(安装最新LTS版): pip3 install django==2.0.7 创建一个django项目 ...

  5. Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)

    Django中ORM介绍和字段及字段参数   Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...

  6. RBAC 介绍 (权限)

    RBAC是什么? RBAC是基于角色的访问控制(Role-Based Access Control )在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权 ...

  7. Openresty最佳案例 | 第8篇:RBAC介绍、sql和redis模块工具类

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78616738 本文出自方志朋的博客 RBAC介绍 RBAC(Role-Based Acce ...

  8. 6月20日 Django中ORM介绍和字段、字段参数、相关操作

    一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...

  9. rbac介绍、自动生成接口文档、jwt介绍与快速签发认证、jwt定制返回格式

    今日内容概要 RBAC 自动生成接口文档 jwt介绍与快速使用 jwt定制返回格式 jwt源码分析 内容详细 1.RBAC(重要) # RBAC 是基于角色的访问控制(Role-Based Acces ...

随机推荐

  1. java byte[]与十六进制字符串相互转换

    http://blog.csdn.net/worm0527/article/details/69939307 http://blog.csdn.net/androiddeveloper_lee/art ...

  2. Leetcode 题解 Jump Game

    一,笨方法  o(n^2).果然看完别人的解法就自惭形秽啊!! 我用的动态规划方法. 比如输入 i: 0 1 2 3 4 ———————————————— a[i]: 2 3 1 0 4 直接利用原来 ...

  3. 虚拟机扩容mac

    VMware虚拟机Mac增大容量: 1.设置硬盘容量大小 2.打开虚拟机的终端,找到需要扩展的硬盘.输入命令 :diskutil list 注意 :我的硬盘名字叫yz,这一行可以看见当前分配容量,最后 ...

  4. 向SqlParameter内动态添加参数

    动态向SqlParameter 里添加相应参数,方法如下 先定义一个List,然后再往List里面添加SqlParameter对象,然后将List转为SqlParameter数组即可 List< ...

  5. Linux:使用互斥量进行线程同步

    基础知识 同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数 ...

  6. Python 3 学习笔记(3)

    模块 编写模块 # fibo.py # Fibonacci numbers module def fib(n): # write Fibonacci series up to n a, b = 0, ...

  7. 关于AVAYA CM6和Asterisk(Freepbx)对接的笔记

    最重要的两份参考文档: http://blog.sina.com.cn/s/blog_6db134880102vipo.html https://personalprojects.wordpress. ...

  8. plsql和tsql常用函数比对

    http://www.jb51.net/list/list_154_1.htm 数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1) value fro ...

  9. 关于三层(dao,serviece,servlet)

    在登陆校验中, dao:返回的是resultset 对象,就是  ps.executeQuery(需要强化的是jdbc的具体的流程) 其中的数据库连接时可以自己写 可以通过工厂类 可以通过数据库的连接 ...

  10. lombok @Builder注解使用的例子、反编译之后的代码详解

    lombok的@Builder实际是建造者模式的一个变种,所以在创建复杂对象时常使用 这里对lombok的@Builder和@Data组合的使用示例 import lombok.Builder; im ...