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框架之权限管理一的更多相关文章

  1. Django web框架之权限管理二

    1. login登录 def login(request): if request.method=="GET": return render(request,'login.html ...

  2. 教程:Visual Studio 中的 Django Web 框架入门

    教程:Visual Studio 中的 Django Web 框架入门 Django 是高级 Python 框架,用于快速.安全及可扩展的 Web 开发. 本教程将在 Visual Studio 提供 ...

  3. [oldboy-django][1初始django]web框架本质 + django框架 + ajax

    web框架本质 浏览器(socket客户端) - 发送请求(ip和端口,url http://www.baidu.com:80/index/) - GET 请求头(数据请求行的url上: Http1. ...

  4. Linux(CentOS7)系统中部署Django web框架

    1. 概述 部署django和vue架在逻辑上可以分为web层与数据库层:web前端通过实现了WSGI协议的模块对python代码进行解析,而python代码中则通过特定于数据库的操作接口对数据库进行 ...

  5. Django基础篇--用户权限管理和组管理

    Django作为一个成熟的python后台开发框架,为开发者提供了很多内置的功能,开发者只需要做一些配置就可以完成原生操作中比较复杂的代码编写.这些内置功能中其中一个比较强大的功能就是后台用户管理类. ...

  6. Django web框架 下载安装 简单项目搭建

    什么是web应用? Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件 应用程序有两种模式C/S.B/S.C/S是客 ...

  7. Django web框架篇:基础

    对于web开发者来说,socket是基础.因为Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 对于真实开发中的python web程序来说,一般会分为两 ...

  8. 初识DJango——Web框架

    一.Web框架 HTTP特点 1.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST.每种方法规定了客户与服务器联系的类型不同. 由于HTTP协议简单 ...

  9. Django:web框架本质

    一,web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 1,自定义web框架 impo ...

随机推荐

  1. JavaScript URL汉字编码转换

    在使用url进行参数传递时,经常会传递一些中文名的参数或URL地址,在后台处理时会发生转换错误.在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原来发生不一致.使用 ...

  2. hadoop设置公平队列

    http://hadoop.apache.org/docs/r1.2.1/fair_scheduler.html fair-scheduler.xml文档 <?xml version=" ...

  3. NYOJ 832 DP

    合并游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 大家都知道Yougth除了热爱编程之外,他还有一个爱好就是喜欢玩. 某天在河边玩耍的时候,他发现了一种神奇的 ...

  4. ListBox, ListView, GridView

    ListView是ListBox的派生类,而GridView是ViewBase的派生类 ListView的View属性是ViewBase,所以GridView可以作为ListView的属性 如 < ...

  5. Babel 和 PostCss 的一些基本配置

    Babel 是一个javascript编译器,PostCSS 是一个样式转换工具.两者都可以看作是一个转化平台,我们可以在上面使用一些插件,来达到想要的代码转化.几乎每个前端项目都要使用它们. Bab ...

  6. 【BZOJ4868】期末考试 [三分][贪心]

    期末考试 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description Input Output Samp ...

  7. 51nod1667 概率好题

    基准时间限制:4 秒 空间限制:131072 KB 分值: 640  甲乙进行比赛. 他们各有k1,k2个集合[Li,Ri] 每次随机从他们拥有的每个集合中都取出一个数 S1=sigma甲取出的数,S ...

  8. 【洛谷 P3628】 [APIO2010]特别行动队 (斜率优化)

    题目链接 斜率优化总结待补,请催更.不催更不补 \[f[i]=f[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c\] \[=f[j]+a*sum[i]^2+a*s ...

  9. ajax post请求json数据在spring-controller解析

    1.前端post请求数据: userInfo=[{"id":"5","uname":"小李","phone&q ...

  10. bzoj 1406 数论

    首先问题的意思就是在找出n以内的所有x^2%n=1的数,那么我们可以得到(x+1)(x-1)=y*n,那么我们知道n|(x+1)(x-1),我们设n=a*b,那么我们对于任意的a,我们满足n%a==0 ...