crm权限管理系统
rbac----->role-based-access-control :基于角色的权限管理
1 1 中间件 session 2 2 wsgi ---->wsgiref 3 3 socketserver 4 5 CRM: 6 7 1 权限组件 8 2 stark组件 9 3 crm 10 11 上节回顾: 12 13 定义中间件: 14 15 MIDDLEWARE = [ 16 'django.middleware.security.SecurityMiddleware', 17 'django.contrib.sessions.middleware.SessionMiddleware', 18 'django.middleware.common.CommonMiddleware', 19 'django.middleware.csrf.CsrfViewMiddleware', 20 'django.contrib.auth.middleware.AuthenticationMiddleware', 21 'django.contrib.messages.middleware.MessageMiddleware', 22 'django.middleware.clickjacking.XFrameOptionsMiddleware', 23 'my_middleware.M1', 24 'my_middleware.M2', 25 ] 26 27 class Md1(MiddlewareMixin): 28 29 def process_request(self,request): 30 31 print("Md1请求") 32 #return HttpResponse("Md1中断") 33 34 def process_response(self,request,response): 35 print("Md1返回") 36 return HttpResponse("123") 37 38 def process_view(self, request, callback, callback_args, callback_kwargs): 39 print("Md1 process_view",callback,callback_args,callback_kwargs) 40 # ret=callback(request) 41 # return ret 42 43 def process_exception(self,request,exception): 44 print("md1 process_exception...") 45 46 47 48 Ajax参数: 49 50 $.ajax({ 51 url:"", 52 dataType:"json", 53 data:JSON.stringify({a:1,b:2}), 54 //contentType:"url_encoded" // a=1&b=2 55 contentType:"json" // a=1&b=2 56 57 success:function(data){ 58 // var data=JSON.parse(data) 59 } 60 }) 61 62 63 一 权限组件 64 65 什么权限? 66 67 权限:URL 68 69 70 版本1: 71 72 UserInfo(): 73 ''' 74 用户表 name age 75 ''' alex 33 76 name=.... egon 34 77 age=..... yuan 23 78 permissions=models.Many2Many() 79 Permission(): 80 ''' 81 权限表 id url title 82 ''' 1 /users/ 查看用户 83 url=.... 2 /users/Add 添加用户 84 title=.... 3 /users/del 删除用户 85 4 /users/del 编辑用户 86 87 88 UserInfo2Permission id userInfo_id permission_id 89 90 1 5 1 91 2 5 2 92 3 5 4 93 94 4 6 1 95 5 6 2 96 6 6 4 97 98 7 7 1 99 8 7 2 100 9 7 4 101 102 103 版本2: 104 105 106 UserInfo() 107 ''' 108 用户表 id name age 109 ''' 1 alex 33 110 name=.... 2 egon 34 111 age=..... 3 yuan 23 112 roles=models.Many2Many("Role") 113 114 115 Role(): 116 id name 117 name =.... 1 CEO 118 permissions=models.Many2Many("Permission") 2 CTO 119 3 销售员 120 4 销售经理 121 122 123 UserInfo2Role: 124 id userInfo_id role_id 125 126 1 1 3 127 2 1 4 128 3 2 3 129 4 3 1 130 5 3 2 131 132 133 134 Permission(): 135 ''' 136 权限表 id url title 137 ''' 1 /users/ 查看用户 138 url=.... 2 /users/Add 添加用户 139 title=.... 3 /users/del 删除用户 140 4 /users/del 编辑用户 141 142 143 144 145
我们的权限管理就是权利限制,
不同人的身份不一样,所有拥有的权利限制级别不一样,这个还比较好理解就不过多的赘述了,
我们要如何控制不同的人不同的身份限制呢?举例说明,一个页面,不同的人拥有不一样的权限,那么他们看到的结果就不一样,我们对于一些功能显示的时候就需要做出区分,这个功能他可以看到,但是那个就不行,这就是需求,我们了解需求之后,就需要创建表关系,就像我们的博客系统一样,我们要了解需求之后再去根据需求做出相应,把所涉及到的关系整理出来,然后再开始我们的项目的建立,
我们的表关系,大概有三个表格,人员名单表格包括人员的具体信息,还有权限表格(包括权限的名字以及权限的具体描述),还有就是角色表格(其实可以理解为部门表格,就是会有一些人是相同的角色,就相当于相同的部门),包括角色名称,再接下来就是我们的表格关系整理,我们的人员信息表格和角色表格是多对多的关系,一个人可以扮演多个角色,一个角色可以由多个人扮演,
角色表格和权限表格是多对多的关系,一个角色可以有多个权限,同样一个权限可以有多个角色,所以我们一般按照查询顺序来判定多对多的那个字段建立在哪个表格里面,原则上来说是无所谓建立在哪里的.
下面是表格的建立关系:
1 from django.db import models 2 3 # Create your models here. 4 5 6 class UserInfo(models.Model): 7 name = models.CharField(max_length=32) 8 pwd = models.CharField(max_length=32, default=123) 9 email = models.EmailField() 10 roles = models.ManyToManyField(to='Role') 11 12 def __str__(self): 13 return self.name 14 15 16 class Role(models.Model): 17 title = models.CharField(max_length=32) 18 permission = models.ManyToManyField(to='Permission') 19 20 def __str__(self): 21 return self.title 22 23 24 class Permission(models.Model): 25 title = models.CharField(max_length=32) 26 url = models.CharField(max_length=32) 27 28 def __str__(self): 29 return self.title
然后就是url路由系统:
1 urlpatterns = [ 2 url(r'^admin/', admin.site.urls), 3 url(r'^login/', views.login), 4 url(r'^users/', views.users), 5 url(r'^orders/', views.orders), 6 ]
views函数:
1 from django.shortcuts import render,redirect,HttpResponse 2 # Create your views here. 3 from rbac.models import * 4 5 6 def login(request): 7 if request.method == 'GET': 8 return render(request, 'login.html') 9 else: 10 user1 = request.POST.get('user') 11 pwd = request.POST.get('pwd') 12 user = UserInfo.objects.filter(name=user1, pwd=pwd).first() 13 if user: 14 # 验证成功之后做什么 15 request.session['user_id'] = user.pk 16 # 我们这里把id值存入到session里面,这样我们后期需要对数据进行编辑或# 者删除的时候都是需要一个id条件作为抓手的,把它存入到session是极好# 的,同理,下面的permission_list也是同理, 17 # 当前用户的所有权限 18 permission_info = user.roles.all().values('permission__url', 'permission__title').distinct() 19 # print(permission_info) 20 temp = [] 21 for i in permission_info: 22 temp.append(i['permission__url']) 23 request.session['permission_list'] = temp 24 # {'user_id':1,'permission_list':['/ursers/','/orders/']} 25 print(request.session['permission_list']) 26 return HttpResponse('congratulation!') 27 else: 28 return redirect('/login/') 29 30 31 def users(request): 32 return HttpResponse('user_list') 33 34 35 def orders(request): 36 return HttpResponse('order_list')
HTML模板:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <title>Title</title> 8 </head> 9 <body> 10 {#我们的form表单的4要素,要有method,要有input框,input输入框里面要name属性,要有submit提交按钮,最后的csrftoken必须携带上#} 11 <form action="" method="post"> 12 <p>user: <input type="text" name="user"></p> 13 <p>pwd: <input type="password" name="pwd"></p> 14 <p><button value="submit" typpe="submit">submit</button></p> 15 {% csrf_token %} 16 </form> 17 </body> 18 </html>
还没完,这上面仅仅是不重要的部分,
后续还有功能需要补充,
setting文件里面还有中间件以及App需要注册进去,我们的App有用来执行项目的,还有用来辅助执行项目的,作为辅助执行的,各司其职,才可以推动发展,当然了功能也是不一样的,
在app里面把手动建立的用于辅助执行项目的App注册上,还有在总项目的init文件里面把models的引入写好,当然了前提是你需要使用到mysql数据库,如果是用SQLit数据库则不需要这样,init里面写入:
import pymysql
pymysql.install_as_MySQLdb()
我们的表格models也是写入到入到执行的文件里面的,它有一个学名叫组件,我们的中间件也是写到这里的,中间件需要有一个文件夹包裹住它,然后再在文件夹里面建立一个py文件,在里面写类,以及逻辑处理,我们在setting里面引入中间件的时候以总项目作为根目录,一级一级查找,直至找到中间的类名为止,
上面一直在提到中间件,为什么要加上中间件呢,因为我们的权限管理系统,就是要加上权限,怎么加上呢,就是用中间件加,为什么呢,因为我们的views视图里面的每一个函数都是需要验证,不论是哪一个函数都是需要验证过,然后才能根据验证的结果来响应相应的内容,这个时候我们使用装饰器是可以解决这个问题的,但是最优的解决方案还是中间件,所以,我们当然要使用它!
中间件代码:
1 from django.utils.deprecation import MiddlewareMixin 2 3 from django.shortcuts import redirect, HttpResponse 4 import re 5 6 7 class M1(MiddlewareMixin): 8 def process_request(self, request): 9 # pass 10 # /admin/login/?next=/admin/ 11 current_path = request.path_info 12 print(current_path) 13 valid_url_menu = ['/login/', '/reg/', '/admin/.*'] 14 for valid_url in valid_url_menu: 15 ret = re.match(valid_url, current_path) 16 if ret: 17 return None 18 19 permission_list = request.session.get('permission_list') 20 if not permission_list: 21 return redirect('/login/') 22 # /users/edit/3 23 flag = False 24 for permission_url in permission_list: 25 res = re.match(permission_url, current_path) 26 if res: 27 flag = True 28 break 29 # if not flag: 30 return HttpResponse('sorry no purview')
我们的逻辑是,要有权限表格,然后里面有权限的具体内容,我们在逻辑代码里面把权限内容都查询出来,然后把当前用户的权限信息都过滤出来,进行匹配,如果当前用户的权限信息,能与之匹配上的话,我们就把对应的权限内容给他展开,否则就不能展开