您的位置:首页 > 编程语言 > Go语言

Django web框架之权限管理一

2017-11-13 11:41 423 查看

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),
]

  

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: