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
models

 

然后就是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')
View Code

 

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>
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')
middleware code

 

 

 

我们的逻辑是,要有权限表格,然后里面有权限的具体内容,我们在逻辑代码里面把权限内容都查询出来,然后把当前用户的权限信息都过滤出来,进行匹配,如果当前用户的权限信息,能与之匹配上的话,我们就把对应的权限内容给他展开,否则就不能展开

posted @ 2018-03-05 22:25  dream-子皿  阅读(295)  评论(0编辑  收藏  举报