一 . 权限控制

  表结构的设计

    rbca(Role Based Access Control)  基于角色的权限控制

    3个model  5张表

class User(models.Model):
# 用户表
username = models.CharField(max_length=16)
password = models.CharField(max_length=16)
# 多对多的外键一般写在查询方便的那一边
roles = models.ManyToManyField('Role', verbose_name='用户和角色关系表',blank=True) class Role(models.Model):
# 角色表
username = models.CharField('角色',max_length=16)
permissions = models.ManyToManyField('Permission', verbose_name='角色和权限关系表', blank=True) class Permission(models.Model):
# 权限表
url = models.CharField('权限', max_length=64)
title = models.CharField('标题', max_length=16)

      

# 权限表里面的url一定要加上 / / , 这样用正则的时候才能匹配成功

 

二 . 在admin中对表进行操作

  

# 创建超级用户的命令
python manage.py createsuperuser # 然后在admin文件中创建表
from django.contrib import admin
admin.site.register(models.Permission)
admin.site.register(models.User)
admin.site.register(models.Role

  登录admin,样式不是我们想要的,我们需要进行一下操作

  

 然后在admin中写上:

  

  修改之后的结果

  

  还可以在展示页面上直接对字段进行编辑

  

  展示结果

  

三 . 权限控制的流程

  其实我们控制权限的实质就是让某些人能访问特定的url

   我们需要把权限控制的验证写到中间件中去

# 视图函数
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
obj = models.User.objects.filter(username=username, password=password).first()
if not obj:
return render(request, 'login.html', {'error': '用户名或密码错误'})
# 跨表查询用双下划线 ORM获取到权限信息 过滤掉权限为空的 去重
permission_query = obj.roles.filter(permissions__url__isnull=False).values('permissions__url', 'permissions__title').distinct() # session的值需要是可序列化的, 需要把QuerySet变成列表
request.session['permission'] = list(permission_query)
request.session['is_login'] = True
return redirect('index')
return render(request,'login.html')
 from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirect
from django.conf import settings
import re
class RbacMiddleWare(MiddlewareMixin):
def process_request(self,request):
# 获取当前访问的页面
url = request.path # 白名单
for i in settings.WHITE_LIST:
# match 匹配上得到一个对象,匹配不上返回None
if re.match(i, url):
return
# 获取登录状态
is_login = request.session['is_login']
# 没有登录跳转登录页面
if not is_login:
return redirect('login') # 免认证
for i in settings.NO_PERMISSION_LIST:
# match 匹配上得到一个对象,匹配不上返回None
if re.match(i, url):
return # 获取当前用户的权限, 要用get去拿,没有显示None,[]就会报错
permission_list = request.session.get('permission')
# print(permission_list)
# 权限的校验
for permission in permission_list:
# print('>>>>',permission)
if re.match(f'^{permission["permissions__url"]}$', url):
return
# 没有匹配成功
return HttpResponse('你的level不够!!')

权限认证中间件

  

我们在其他py文件中引入settings的时候,要用以下方式

from django.conf import settings

Django--权限信息操作的更多相关文章

  1. 《玩转Django2.0》读书笔记-Django配置信息

    <玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...

  2. django权限管理

    当我们为应用创建一个Models, 在同步到数据库里,django默认给了三个权限 ,就是 add, change, delete权限. 首先,我们创建一个perm_test的project, 然后再 ...

  3. Django权限控制进阶

    一.一级菜单的排序 我们用字典存放菜单信息,而字典是无序的,当一级菜单过多时可能会出现乱序情况,因此需要给一级菜单排序 1.给一级菜单表的model中加一个weight权重的字段 ,权重越大越靠前 w ...

  4. django权限之二级菜单

    遗漏知识点 1.构建表结构时,谁被关联谁就是主表,在层级删除的时候,删除子表的时候,主表不会被删除,反之删除主表的话,字表也会被删除, 使用related_name=None   反向查询,起名用的 ...

  5. Django之Model操作

    Django之Model操作 本节内容 字段 字段参数 元信息 多表关系及参数 ORM操作 1. 字段 字段列表 AutoField(Field) - int自增列,必须填入参数 primary_ke ...

  6. 【Python】django权限管理

    参考:http://www.cnblogs.com/esperyong/ 参考:https://docs.djangoproject.com/en/1.8/topics/auth/default/#t ...

  7. Python之路【第二十二篇】:Django之Model操作

    Django之Model操作   一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...

  8. [Python学习] Django 权限控制

    本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事. 一.主要内容 1.什么是权限管理? 2.Web 权限 3.Django 权限机制 ...

  9. Django之ORM操作

    Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...

随机推荐

  1. [CQOI2018]九连环

    嘟嘟嘟 对于这种找规律的题,我向来是不会的. 通过大佬们的各种打表找规律.神奇dp等方法,我们得到了答案就是\(\lfloor \frac{2 ^ {n + 1}}{3} \rfloor\). 高精是 ...

  2. [转]Oracle 清除incident和trace -- ADRCI用法

    在oracle11g中,dump file的目录已经有所改变,bdump和udump整合到trace中,cdump独立出一个. E:\ora11g\app\Administrator\diag\rdb ...

  3. vue.js鼠标经过和离开事件 mouseover mouseout

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code @mouseover="showEwm(1)" @mouseout ...

  4. 10 python 初学(Python 的编码解码)

    Python 2 : ASCII Python 3 :Unicode

  5. C语言初学者关于数组指针的深度讨论

    一.什么是数组指针? 即是数组的指针.首先它是一个指针,指向数组,指针本身占4个字节. 二.数组指针的使用 int a[3][5]; int (*p)[5]; p=&a; 第二行定义了一个数组 ...

  6. OpenCV3计算机视觉Python语言实现笔记(一)

    Python3下OpenCV的安装 :http://blog.csdn.net/lwplwf/article/details/61616493 1. 读/写图像文件 OpenCV的imread()函数 ...

  7. web 项目:解决插入 MySQL 数据库时中文乱码问题

    背景:在做 javaweb 项目的时,前台传递的中文最后插入数据库的时候总是出现乱码现象. 解决方案 ​ A.不管是使用 Idea.eclipse,确定自己的项目所使用的字符集是 UTF-8. ​ B ...

  8. SpringMVC处理跨域请求时的一个注意事项

        由于公司对SpingMVC框架里面的东西进行了扩展,在配置SpringMVC时没有使用<mvc:annotation-driven>这个标签.而且是自己手动来配置HandlerMa ...

  9. 通过 JS 脚本去除csdn广告

    1. chorme 浏览器 1.1 通过书签方式添加 新建书签: 在网址一栏中输入: javascript: $(function () { $('aside .csdn-tracking-stati ...

  10. RabbitMQ 高可用之镜像队列

    如果RabbitMQ集群只有一个broker节点,那么该节点的失效将导致整个服务临时性的不可用,并且可能会导致message的丢失(尤其是在非持久化message存储于非持久化queue中的时候).可 ...