一 . 权限控制

  表结构的设计

    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. 设计模式C++实现——装饰者模式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/walkerkalr/article/details/28633123 模式定义:         装 ...

  2. Python 字典方法

    访问字典的值 字典中的 键/值 实际上就是一种映射关系,只要知道了 “键”,就肯定知道 “值”. >>> my_dict = dict(name = 'zhangsan',other ...

  3. 什么是JWT

    根据维基百科的定义,JSON WEB Token(JWT,读作 [/dʒɒt/]),是一种基于JSON的.用于在网络上声明某种主张的令牌(token).JWT通常由三部分组成: 头信息(header) ...

  4. Java 定义静态list

    private final static List<String> imgList = Arrays.asList("group1/M00/0B/B0/rBGl-lvr7vWAN ...

  5. CentOS7.4 ISCSI

    试验机配置: cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) uname -r 3.10.0-693.el7.x86_64 所 ...

  6. Android自动化测试学习路线

    最近在整理Android自动化测试的相关资料,大体上把一些知识点梳理了,这里做一个简单的分享! Android里面测试相关的工具和框架太多了.你应该从以下几个方面入手. 编程语言的选择 如果你要学习的 ...

  7. 典型分布式系统分析:Bigtable

    本文是典型分布式系统分析的第三篇,分析的是Bigtable,一个结构化的分布式存储系统. Bigtable作为一个分布式存储系统,和其他分布式系统一样,需要保证可扩展.高可用与高性能.与此同时,Big ...

  8. Jmeter性能与接口自动化实战

    本书可以作为工具书,也可以作为jmeter疑难杂症的良方!各位同学在jmeter学习中遇到的常见难题,在本文中都可以检索到答案. 大纲如下: ☞点击这里,获取本书

  9. 一次掌握 React 与 React Native 两个框架

    此系列文章将整合我的 React 视频教程与 React Native 书籍中的精华部分,给大家介绍 React 与 React Native 结合学习的方法. 1. 软件开发语言与框架的学习本质 我 ...

  10. Mysql启动找不到mysql.sock文件问题(Centos7)

    刚装完Mysql5.7,将Mysql添加到开机自启.reboot之后mysql服务却没启动起来, 直接输入mysql –uroot –p ,出现如下错误,找不到mysql.sock文件.用servic ...