一 . 权限控制

  表结构的设计

    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

最新文章

  1. js 常用函数收集(基础)
  2. jQuery学习笔记(五)jQuery中的表单
  3. 报错记录:getOutputStream() has already been called for this response
  4. AJax中post与get请求注意事项
  5. 委托,C#本身的委托(Action Func)
  6. linux下cat命令详解
  7. jquery实现点击按钮滑动到指定位置
  8. 栈的简单应用 HDU 1022 http://acm.hdu.edu.cn/showproblem.php?pid=1022
  9. css经典布局之左侧固定大小右侧自动适应
  10. Libevent源码分析—event_set()
  11. (转)Centos7 Nginx安装
  12. CLR类型设计之属性
  13. kerberos环境下spark消费kafka写入到Hbase
  14. python数据类型、if判断语句
  15. [PHP] 理解依赖注入
  16. nGrinder TestRunnerBarrier.groovy / jihedian
  17. mysql5.7安装(正确安装)实战
  18. [easyUI] lazyload 懒加载
  19. 测试快速关闭innodb的方法
  20. 019 spark on yarn(Job的运行流程,可以对比mapreduce的yarn运行)

热门文章

  1. 接入天猫精灵auth2授权页面https发送ajax请求
  2. IPS简单使用方法
  3. node.js之express框架
  4. CRF 条件随机场工具包
  5. StackExchange.Redis使用配置
  6. Angularjs 过滤器使用
  7. handsontable-chosen-editor
  8. C# 设置最顶层窗口。TopMostWindow
  9. 【php增删改查实例】第二十六节 - 个人详情页制作
  10. 十分钟学会Java8:lambda表达式和Stream API