Django web框架之权限管理一
1. 需求分析:
准备:创建独立app,
rbac #权限管理模块/组件
app01 #应用 分配权限,URL
2. 数据库设计
2.1 设计思路
第一版: 权限表:
ID url title is_menu
1 /index/ 首页 False
2 /userinfo/ 用户列表 True
3 /userinfo/add/ 添加用户 True
4 /userinfo/del/(\d+)/ 删除用户 False
5 /userinfo/edit/(\d+)/ 修改用户 False 用户表:
ID username password ....
1 番禺 123
2 夹缝 123
3 果冻 123
4 鲁宁 123 权限用户关系表:
用户ID 权限ID
1 1
1 2
1 3
1 4
1 5
2 1
2 2
2 3
3 1
4 1
4 2
4 3
第二版: 用户表:
ID username password ....
1 番禺 123
2 夹缝 123
3 果冻 123
4 鲁宁 123 角色表:
ID title
1 CEO
2 CTO
4 COO
5 部门经理
6 技术员 用户和角色关系表:
用户ID 角色ID
1 1
1 2
1 4
2 5
3 6
4 6 权限表:
ID url title
1 /index/ 首页
2 /userinfo/ 用户列表
3 /userinfo/add/ 添加用户
4 /userinfo/del/(\d+)/ 删除用户
5 /userinfo/edit/(\d+)/ 修改用户 角色权限关系表:
角色ID 权限ID
1 1
2.2 创建表类app01.models.py
from django.db import models class UserInfo(models.Model):
username=models.CharField(max_length=32,verbose_name='用户名')
password=models.CharField(max_length=32,verbose_name='密码')
email=models.CharField(max_length=32,verbose_name='邮件') roles=models.ManyToManyField(to='Role',verbose_name='具有的所有角色',blank=True)
class Meta:
verbose_name_plural='用户表' def __str__(self):
return self.username class Permissions(models.Model):
title=models.CharField(max_length=64,verbose_name='标题')
url=models.CharField(max_length=64,verbose_name='含规则URL')
is_menu =models.BooleanField(verbose_name='是否是菜单') class Meta:
verbose_name_plural='权限表' def __str__(self):
return self.title class Role(models.Model):
title=models.CharField(max_length=32) permissions=models.ManyToManyField(to='Permissions',verbose_name='具有的所有权限',blank=True) class Meta:
verbose_name_plural='角色表' def __str__(self):
return self.title
3. 权限录入:
CEO:番禺
/userinfo/
/userinfo/add/
/userinfo/edit/(\d+)/
/userinfo/del/(\d+)/
/order/
/order/add/
/order/edit/(\d+)/
/order/del/(\d+)/
总监:鲁宁
/userinfo/
/userinfo/add/
/order/
/order/add/
经理:肾松
/userinfo/
/order/
业务员:肾松,文飞,成栋
/order/ PS: 去重 问题:
1. 用户登录
- 获取当前用户具有的所有角色
- 获取当前用户具有的所有权限
- 获取当前用户具有的所有权限(去重)
4. 权限梳理
a. 创建rbac app
b. 创建表结构,rbac,基于角色权限控制
- 三个类
- 五张表 c. 基于Django admin录入权限数据
python manage.py createsuperuser
- root
- root!2345 d. 用户登录程序
- 获取当前用户具有的所有权限(去重)
- 获取权限中的url,放置到session中
rabc.service.init_permission
def init_permission(user,request):
pass e. 中间件
- 白名单
- 获取请求URL
- session保存的权限信息
- 循环url,re.match(db_url, current_url)
5. rbac中的代码:
- models.py
- admin.py
- service.init_permission.py #权限攻击组件
- middlewares.rabc.py #中间件 配置文件中setting配置白名单:
VALID_URL = [
"/login/",
"/admin.*"
]
6 代码展示
6.1 E:\Django项目练习03\rbac\service\init_permissions.py
def init_permissions(user,request):
url_list = []
# 获取user中所有的url权限
permission_url_list = user.roles.values('permissions__url', 'permissions__title', 'permissions__is_menu').distinct()
# 将url权限去重添加到url_list列表中
for item in permission_url_list:
url_list.append(item['permissions__url']) print('url_list:',url_list)
# 定制session
request.session['permission_url_list'] = url_list
6.2 中间件setting配置
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'rbac.middlewares.rbac.RbacMiddleware' #权限管理组件引用路径
]
6.3 rbac.py文件代码 E:\Django项目练习03\rbac\middlewares\rbac.py
import re
from django.shortcuts import render,redirect,HttpResponse
from django.conf import settings class MiddlewareMixin(object):
def __init__(self, get_response=None):
self.get_response = get_response
super(MiddlewareMixin, self).__init__() def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response class RbacMiddleware(MiddlewareMixin):
def process_request(self,request):
# 1.获取当前的请求url:request.path_info
# 2.获取session中保存当前用户的权限
# request.session.get("permission_url_list") current_url = request.path_info
# 当前请求不需要执行权限验证
for url in settings.VALID_URL:
if re.match(url,current_url):
return None
permission_list = request.session.get("permission_url_list")
print('permission_list',permission_list) if not permission_list:
return redirect('/login/') flag=False
for db_url in permission_list:
regax="^{0}$".format(db_url)
if re.match(regax,current_url):
flag =True
break if not flag:
return HttpResponse('无权访问')
6.4 使用rbac组件 应用路径:E:\Django项目练习03\app01\views.py
from django.shortcuts import render,redirect,HttpResponse
from app01 import models from rbac.service.init_permissions import init_permissions def login(request):
if request.method=="GET":
return render(request,'login.html')
else:
username=request.POST.get('user')
password=request.POST.get('pwd')
user=models.UserInfo.objects.filter(username=username,password=password).first()
if not user:
return render(request,'login.html')
else:
init_permissions(user,request) #定制session模块 return redirect('/index/') def index(request):
return HttpResponse('首页页面') def userinfo(request):
return HttpResponse('用户管理') def userinfo_add(request):
return HttpResponse('添加用户') def order(request):
return HttpResponse('订单管理') def order_add(request):
return HttpResponse('添加订单')
6.5 路由文件配置
from django.conf.urls import url
from django.contrib import admin
from app01 import views as app01_views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', app01_views.login),
url(r'^index/', app01_views.index),
url(r'^userinfo/$', app01_views.userinfo),
url(r'^userinfo/add/$', app01_views.userinfo_add),
url(r'^order/$', app01_views.order),
url(r'^order/add/$', app01_views.order_add),
]
Django web框架之权限管理一的更多相关文章
- Django web框架之权限管理二
1. login登录 def login(request): if request.method=="GET": return render(request,'login.html ...
- 教程:Visual Studio 中的 Django Web 框架入门
教程:Visual Studio 中的 Django Web 框架入门 Django 是高级 Python 框架,用于快速.安全及可扩展的 Web 开发. 本教程将在 Visual Studio 提供 ...
- [oldboy-django][1初始django]web框架本质 + django框架 + ajax
web框架本质 浏览器(socket客户端) - 发送请求(ip和端口,url http://www.baidu.com:80/index/) - GET 请求头(数据请求行的url上: Http1. ...
- Linux(CentOS7)系统中部署Django web框架
1. 概述 部署django和vue架在逻辑上可以分为web层与数据库层:web前端通过实现了WSGI协议的模块对python代码进行解析,而python代码中则通过特定于数据库的操作接口对数据库进行 ...
- Django基础篇--用户权限管理和组管理
Django作为一个成熟的python后台开发框架,为开发者提供了很多内置的功能,开发者只需要做一些配置就可以完成原生操作中比较复杂的代码编写.这些内置功能中其中一个比较强大的功能就是后台用户管理类. ...
- Django web框架 下载安装 简单项目搭建
什么是web应用? Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件 应用程序有两种模式C/S.B/S.C/S是客 ...
- Django web框架篇:基础
对于web开发者来说,socket是基础.因为Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 对于真实开发中的python web程序来说,一般会分为两 ...
- 初识DJango——Web框架
一.Web框架 HTTP特点 1.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST.每种方法规定了客户与服务器联系的类型不同. 由于HTTP协议简单 ...
- Django:web框架本质
一,web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 1,自定义web框架 impo ...
随机推荐
- AOJ.849 分数 (暴力)
AOJ.849 分数 (暴力) 题意分析 每次枚举分子,然后根据给出的分数值,推算出来分母,然后取分母上下几个数进行进一步计算,看看哪个更接近. 一开始想着直接枚举分子和分母,复杂度爆炸... 代码总 ...
- react事件机制
1. react的事件是合成事件((Synethic event),不是原生事件 <button onClick={this.handleClick}></button> &l ...
- bzoj1968: [Ahoi2005]COMMON 约数研究(数论)
计算每一个数的贡献就好了..O(N) n/i只有2*sqrtn个取值于是可以优化到O(sqrtn) #include<bits/stdc++.h> #define ll long long ...
- [LOJ 6004] 圆桌聚餐
link 其实网络流就是再考你如何去建边. 先见$S$,$T$为源点与汇点,然后将$S$连向每一个单位,流量为每个单位的人数,然后将每一个单位连向每一个餐桌,流量为$1$,最后在将每一个餐桌与$T$相 ...
- 淘淘搜索结果中image属性中有多张图片的处理
solr引擎查询某一个 商品后的结果中,image字段中如果有多张图片路径(用逗号隔开)时,前台会不 显示图片,解决方法如下: package com.taotao.portal.pojo; publ ...
- iOS AFNetworking 2.6.0框架导入报错解决方法
最近手动导入AFNetworking 2.6.0框架时发现Xcode报如下3个错误: 1. Use of undeclared identifier ‘kSecFormatUnknown‘ 2. Us ...
- UVA 11922 Splay tree
UVA 11922 题意: 有n个数1~n 操作a,b表示取出第a~b个数,翻转后添加到数列的尾部 输入n,m 输入m条指令a,b 输出最终的序列 代码: #include<iostream&g ...
- android极光推送初步了解
推送可以及时,主动的与用户发起交互 (1)继承jar包,照示例AndroidManifest.xml添加. (2)自定义MyApp继承自Application,在onCreate方法中调用JPushI ...
- Hibernate入门(3)- 持久对象的生命周期介绍
在hibernate中对象有三种状态:瞬时态(Transient). 持久态(Persistent).脱管态或游离态(Detached).处于持久态的对象也称为PO(Persistence Objec ...
- 图论:Floyd-多源最短路、无向图最小环
在最短路问题中,如果我们面对的是稠密图(十分稠密的那种,比如说全连接图),计算多源最短路的时候,Floyd算法才能充分发挥它的优势,彻彻底底打败SPFA和Dijkstra 在别的最短路问题中都不推荐使 ...