权限部分

 

crm 部分

1. 权限基本流程

#用户登录成功后获取权限信息,将【权限和菜单】信息写入到session。
#以后用户在来访问,在中间件中进行权限校验。
#为了提升用户体验友好度,在后台通过inclusion_tag动态生成一个二级菜单。

2. 使用权限

#- 用户登陆:权限和菜单的初始化; init_permission
#- 配置中间件
#- 配置白名单
#- 配置session中使用到的key
#- load rbac
#- menu ,inclusion_tag 生成菜单
#- filter,可以在if后做条件,粒度控制到按钮。

 

一、问题:

1. 为什么程序需要权限控制?

2. 为什么要开发权限组件? 

3. web开发中权限指的是什么?

#一个权限 约等于 URL

 

二、设计权限系统表结构

第一版设计:

#用户表:
#ID Name 

#权限表:
#ID  Url

#用户权限关系表:
#ID   用户ID   权限ID 

 

第二版设计,基于角色的权限控制 rbac (role based access control)

#用户表:       #ID Name 

#角色表         #ID  title

#用户角色关系表:#ID   用户ID   角色ID 

#权限表:       #ID  Url

#角色权限关系表:#ID 角色ID 权限ID

 

8. 如何在其他系统中应用目前的rbac组件。
#a. 拷贝rbac组件
#b. 清空migrations目录
#c. 注册rbac 到app
d. 数据库迁移并录入权限信息
#e. 用户登陆做权限和菜单的初始化 init_permission 
#f. 应用中间件进行权限校验
#g. 设置配置文件
#h. 显示动态菜单
#j. 粒度控制到按钮 

 

 

1. 权限有几张表?

2. 简述权限流程?

3. 为什么要把权限放入session? 

4. 静态文件和模块文件

5. 相关技术点

#- orm查询
#- 去空
#- 去重 
#- 中间件 
#- inclusion_tag 
#- 引入静态文件
#{% load staticfiles %}
#{% static '....' %}

 

6. 二级菜单时,如何构造的数据结构?

menu_dict = {

          1:{

               title:'信息管理',
               icon:'fa-coffee',
               class:'',
               children:[
               {title:'客户列表',url:'/customer/list/','class':'active'},
               ]
            },            
}

 

  

11. 问题: 非菜单的权限归属?

12. 问题:层级导航?

13. 粒度控制到按钮?

14. 阶段总结

1. 如何实现的权限系统?

#粒度控制到按钮级别的权限控制
#- 用户登陆成功之后,将权限和菜单信息放入session
#- 每次请求时,在中间件中做权限校验
#- inclusion_tag实现的动态菜单 

2. 如何实现控制到按钮的呢?

#用户登陆时,用户所拥有的权限 别名==django 路由name 构造成一个字典;
#在页面中写了一个 django模板的filter来进行判断是否显示;

3. 为什么要在中间件中做校验呢?

#所有请求在到达视图函数之前,必须经过中间件,所以在中间件中对请求做处理比较简单; 

4. 模板中的特殊方法:

#inclusion_tag、simpletag、filter

5. 权限中使用了几张表?

#六张,必须要说出来

6. 表中的字段?(背表)

7. 写流程(思维导读)

8. 如何实现粒度到数据行?

#添加一条更细粒度的表,做条件用;

9. 修改权限之后,如想应用最新权限

#- 我们:需要重新登陆。
#- 不用重新登陆,如何完成?更新涉及的所有用户的session信息

10. 最重要 *****

#- 了解权限系统的流程和实现(一行一行过,根据表结构自己写)    不要抄
#- 权限组件的应用

 

1. 简述权限管理的实现原理。

2. 表结构

3. 知识点

#- 中间件白名单:配置文件、中间件return None
#- 权限初始化:
#- left join 
#- 特殊字典的构造
                        权限 = {
                            权限别名:{id:'',title:'',url,pid:''},
                            权限别名:{id:'',title:'',url,pid:''},
                            权限别名:{id:'',title:'',url,pid:''},
                        }
                        
                        菜单 = {
                            菜单ID:{
                                title:'',
                                icon:'',
                                children:[
                                    {id:'1',.....}
                                ]
                            }
                        }
#- key为数字的字典,在序列化时会变成字符串(*)
#- 配置文件 
#- 中间件进行权限校验 
#- 权限校验
#- 导航路径
#- pid,访问无法成为菜单的权限时,默认展开的父级权限ID
                    
#- 动态生成菜单
#- 通过inclusion_tag和两层for循环 + 中间件传来的pid
                
#- 粒度控制到按钮
    #- 基于filter并通过 别名 进行权限的判断;
#session

#orm

  - 去重

  - 去空

#inclusion_tag

#filter

#有序字典

#settings配置

#引入静态文件

#url别名

#namespace 

#路由分发

#构造数据结构

#ModelForm

#组件应用

#admin 

#icon爬虫

#mark_safe

#下载文件

 

 

1. 构造权限结构

def role_test(request):
            # 问题:从数据库中获取所有的权限
            """
            {
                1:{
                    'title':'账单列表',
                    'url':'/payment/list/',
                    'name':'payment_list',
                    children:[
                        {'title':'删除账单','url':'/payment/list/','name':'payment_list'},
                        {'title':'编辑账单','url':'/payment/list/','name':'payment_list'},
                        {'title':'添加账单','url':'/payment/list/','name':'payment_list'},
                    ]
                },
                 2:{
                    'title':'客户列表',
                    'url':'/payment/list/',
                    'name':'payment_list',
                    children:[
                        {'title':'下载客户模板','url':'/payment/list/','name':'payment_list'},
                        {'title':'下载客户模板','url':'/payment/list/','name':'payment_list'},
                        {'title':'下载客户模板','url':'/payment/list/','name':'payment_list'},
                    ]
                }
            }
            """

2. 批量操作权限

#集合交集和差集
#批量操作:form_set

1. 构造父子结构

 

2. 构造家族结构

comment_list = [
                {'id':1, 'title':'写的不错', 'pid':None}
                {'id':2, 'title':'还不错', 'pid':None}
                {'id':3, 'title':'什么万一', 'pid':1}
                {'id':4, 'title':'什么不错', 'pid':2}
                {'id':5, 'title':'x1', 'pid':1},
                {'id':6, 'title':'去你的吧', 'pid':3},
                {'id':7, 'title':'去你的吧', 'pid':6},
            ]
            
            comment_list = [
                {'id':1, 'title':'写的不错', 'pid':None}, # ,children:[]
                {'id':2, 'title':'还不错', 'pid':None},
                {'id':3, 'title':'什么万一', 'pid':1},
                {'id':4, 'title':'什么不错', 'pid':2},
                {'id':5, 'title':'x1', 'pid':1},
                {'id':6, 'title':'去你的吧', 'pid':3},
                {'id':7, 'title':'去你的吧', 'pid':6},
            ]

3. formset

#批量表单处理 

4. ModelForm也有钩子函数

#注意:如果想要主动显示错误信息,可以使用 add_error('字段','错误信息') 

5. FK

class Permission(models.Model):
                """
                权限表
                """
                title = models.CharField(verbose_name='标题', max_length=32)
                url = models.CharField(verbose_name='含正则的URL', max_length=128)
                name = models.CharField(verbose_name='URL别名',max_length=32,null=True,blank=True)
                parent = models.ForeignKey(verbose_name='父权限',to='Permission',null=True,blank=True, limit_choices_to={'parent__isnull':True})
                menu = models.ForeignKey(verbose_name='菜单',to='Menu',null=True,blank=True)

 

6. 获取当前项目中所有的URL

7. name 

#URL别名:  namespace:name 
#URL别名:  name
posted @ 2018-09-09 10:51  虫洞小鳗鱼  阅读(245)  评论(0编辑  收藏  举报