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. BZOJ2761 不重复的数字 【treap】

    2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 5517  Solved: 2087 [Submit][S ...

  2. 洛谷 CF1043F Make It One 解题报告

    CF1043F Make It One 题意 从一堆数中选择最少的数,使它们的\(\gcd=1\) 输入输出格式 输入格式 第一行:一个正整数\(n\). 第二行:\(n\)个正整数,给出了这个数列. ...

  3. 洛谷 P4735 最大异或和 解题报告

    P4735 最大异或和 题目描述 给定一个非负整数序列\(\{a\}\),初始长度为\(N\). 有\(M\)个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数\(x\),序列的 ...

  4. AT1984 Wide Swap

    AT1984 Wide Swap 题意翻译 给出一个元素集合为\(\{1,2,\dots,N\}(1\leq N\leq 500,000)\)的排列\(P\),当有\(i,j(1\leq i<j ...

  5. HDOJ.1800 Flying to the Mars(贪心+map)

    Flying to the Mars 点我挑战题目 题意分析 有n个人,每个人都有一定的等级,高等级的人可以教低等级的人骑扫帚,并且他们可以共用一个扫帚,问至少需要几个扫帚. 这道题与最少拦截系统有异 ...

  6. hdu 5621

    KK's Point Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. 目标世界上最小的Linux系统—ttylinux体验

    ttylinux的官方网址:http://ttylinux.net/ 简单翻译一下: 你当前访问的是ttylinux的主页,一个针对多种CPU架构的极小的GNU/Linux系统.最小的ttylinux ...

  8. C++虚基类的初始化

    #include<iostream> using namespace std; class Base{ public: Base(int sa) { a=sa; cout<<& ...

  9. HDU1698 线段树(区间更新区间查询)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

  10. Git版本管理1-安装配置和同步

    原文载于youdaonote,有图片: http://note.youdao.com/share/?id=79a2d4cae937a97785bda7b93cbfc489&type=note ...