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. nginx压缩,缓存

    https://www.darrenfang.com/2015/01/setting-up-http-cache-and-gzip-with-nginx/ https://www.linuxdashe ...

  2. 在Ubuntu下利用Eclipse调试FFmpeg《转》

    参考原贴,其中编译命令有略微改动. 第一步:准备编译环境 #sudoapt-get update #-dev libspeex-dev libtheora-dev libtool libva-dev ...

  3. 1037B--Reach Median(中位数)

    median 中位数 odd 奇数 even 奇数 You are given an array aa of nn integers and an integer ss. It is guarante ...

  4. deploy service on swarm

    转自:https://www.cnblogs.com/jsonhc/p/7852530.html swarm集群配置完成后,查看一些基本的信息: [root@manager1 ~]# docker-m ...

  5. (笨方法)利用stat函数实现ls -l filename

    学习了一段时间的Linux了,但是我感觉我做不出来啥子,后头选择利用系统IO函数实现命令,先从ls走起吧.先来看看ls -l filename给我们显示了什么吧 : 可以看到,一共八项:文件类型.用户 ...

  6. where后一个条件和多个条件的查询速度

    如果记录中有两个都是 唯一标识的  ,那是都where  and 还是只写一个比较快 ---- 一个快

  7. Haskell语言学习笔记(87)Time

    安装 time $ cabal install time Installed time-1.9.1 Prelude> import Data.Time Prelude Data.Time> ...

  8. CentOS 7下源码安装zabbix服务

    安装环境需要LAMP或者LNMP先搭建好 在此我使用上一篇搭建好的LNMP环境来安装zabbix 1.下载zabbix http://www.zabbix.com/download.php 2.安装及 ...

  9. JSP报错Syntax error, insert ";" to complete Statement

    org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 7 in ...

  10. LISTVIEW显示JPEG缩略图

    http://www.ctsys.cn/files/SHOW_FILES.ASPX?ID=22 许多的JPEG图片浏览器(如由我设计的<JPEG浏览缩放器>),都可以将JPEG缩略图放置到 ...