框架底层和接口终于改造完成了,小白再次找到老菜。

小白:老大,上次你对后台权限系统简单的讲了一下,我一点头绪都没有,现在有空完整的说一说吗?

老菜:说到权限系统,要讲明白真不容易,权限系统并不是越复杂越好,要根据项目的需要而定,有的系统只有几个人操作,并没有必须使用功能强大且复杂的权限管理系统;而有的大型企业,各地区存在分公司,业务与销售数据分级管理,系统数据甚至需要不同角色允许查看不同的数据列,对数据的增、删、查、改都有非常细致的限制,这就需要使用对应的功能强大的权限管理模块,来处理不同的业务需求。

下面我用多张图循序渐进的方式来说明一下权限系统的演变。

首先我们来看看最简单的权限系统是怎么管理的

最简单的权限系统,它只需要验证用户账号与密码是否正确就可以了,进入系统后通过检查session是否失效,来判断用户是否退出,登录进入系统后,所有功能项都开放给用户操作。

相对于前面一种权限,稍微复杂点的权限管理,它只需要管理到菜单级别,简单的对于页面的访问不做控制,复杂点的也只需要在所有链接中,根据访问url生成对应的加密串,在被访问页面的相关接口使用同样的密钥与规则,生成对应的加密串,然后比较两个加密串是否一致就可以防止绝大部分的非法访问了。

这种权限管理,需要增加菜单(主键id、菜单名称、页面url、排序、是否启用、创建时间)和菜单权限管理功能。菜单和页面url的加密处理,在返回菜单时可以由服务器统一生成传回给客户端,客户端只有通过服务器端生成的url才能进入对应的页面。至于怎么做到加密串识别的,可以通过下面方式进行处理:

用户登录后自动生成唯一的由大小写字母和数字组成的标识串做为密钥,然后加上时间戳、被访问页面名称、ip、页面访问参数(比如id值等),用md5加密生成一个加密串,然后将加密串和时间戳、页面访问参数等内容组合成url参数,生成可以访问的url。当用户点击该url访问时,被访问页面接收到这些参数后,通过一样的加密次序进行处理,生成同样的加密串与提交过来的加密串进行比较,就可以识别用户有没有权限访问该页面了。用户通过擅改页面名称或访问参数,被访问页面可以很容易检查到加密串不一致而拒绝访问,可以轻易做到用户只能通过指定url才能访问页面。因为用户不知道密钥是什么,所以他很难进行造假访问无权限访问的页面。

这样处理看起来好像很复杂的样子,实际上开发起来很简单,且只需要一个菜单与菜单权限表,菜单权限表将菜单和管理员账号绑定起来,授权指定管理可以访问的菜单项,权限管理相对来说非常简单且容易实现。

对于上面这种权限,它无法控制页面按键,也就是说它无法控制增删改查等各种操作,所以就延伸出下面这种权限管理方法。

对于前后端分离的系统来说,页面列表数据查看、新增、修改、删除等各种操作,都需要通过ajax将数据或参数提交给对应的接口,然后接口再将运算的结果返回回来,所以我们可以通过限制接口的访问来做到对页面按键功能的控制。

对于这种权限管理,我们只需要在前面的菜单管理功能中进行扩展就可以实现了,在菜单表(主键id、菜单名称、页面url、排序、是否启用、创建时间)中增加上一级菜单id、接口路由地址、是否显示这几个字段就可以了。

由于需要增加页面按键对应的接口控制,为了让菜单分级展示页面与按键绑定的关系,所以需要添加父级菜单id,而接口中路由地址这个字段,熟悉python的bottle框架的小伙伴,可以很清晰的知道每个接口都是通过我们自己设置的路由来访问的,比如说前面获取产品指定主键id实体的地址

@get('/api/product//')defcallback(id):"""获取指定记录"""

@get('/api/product//') 这个就是url访问的路由地址,这些路由地址在整个项目中都是唯一的,且接口被访问时我们很容易直接获取到这个路由标识。所以在开发时,我们可以在底层直接做个拦截,通过判断用户是否有勾选这个路由对应的菜单项,来查看用户是否有访问该接口的权限。

而是否显示字段,主要是为了菜单列表输出时,将这些按键项隐藏,不直接在菜单中显示出来。

而用户权限的管理,跟前面的一样,只需要管理员账号绑定可以访问的菜单项就行了。

对于人员比较多,且人员流动比较频繁的企业来说,使用前面的权限管理起来,会很麻烦。因为人员流动后,需要经常对权限进行相应的调整,无论是新员工入职还是员工更换岗位,都需要重新设置对应的管理员访问权限。为了使权限管理起来更加简单化,这时需要引入职位(角色)与部门(权限组)的概念。对于企业来说,职位比角色更容易理解,不同的职位有不同的工作职责,对于企业的管理系统操作来说也是一样的,不同的职位也有不同的操作权限。而部门主要是为了方便对职位进行分组管理,因为职位多时没有对应的分组,查询不方便,如果有相似的职位,也容易混淆。

对于企业来说,人员由于流动关系可能会经常变化,而职位则相对来说是比较固定的,所以权限由前面直接绑定管理员,改为菜单权限绑定职位。当一位员工更换岗位时,只需要更改他所绑定的职位,对于新入职的员工,也只需要绑定他所入职岗位,他们就可以拥有该职位的所有权限。

当然也会存在一些特殊的需要,比如说某人与同事都隶属于同一个职位,但他是老员工可以拥有更多的权限,这时可以增加一个新职位(通过制定职位级别)来区分他们的权限。

又比如说,如果权限需要限制部门访问权限,而该部门内的职位只能设置当前部门对应的权限,如果有员工需要跨部门拥有其他权限时,可以通过更改管理账号绑定多职位的方式来实现,也就是说一个员工他只可以绑定一个主部门,但他可以同时拥有多个职位,然后享有多个职位共有的权限。

对于常见的企业权限需求来说,这个权限设置就可以满足大部分项目的要求了,后面章节会重点介绍当前这个权限管理体系。

有些项目在权限上可能还有其他方面的特殊需求,比如说前面的权限管理它们都是页面的访问控制,如果想要对页面的查看项和可操作项进行更细一步的控制时,它们就做不到了,这时我们就需要引入新的权限管理体系。

比如说企业内部的文档系统,所有用户对于自己部门或拥有权限的内容都有查看、新增、修改、删除、归档等操作权限,使用按键无法对这些权限进行细分控制。

这时可以创建一个文档权限管理表来专门管理这些操作权限,通过将文档分类记录与职位绑定的方式,在用户查看或操作这些文档时,检查该用户是否拥有对应的权限来进行权限管理。这种权限管理一般是前面权限管理功能的扩展,可以灵活管理各种不同的权限需求。

如果你的系统想要应用到那些大型的企业中,就像前面所讲到的,需要对各地区分公司,业务与销售数据要求分级管理,系统数据甚至需要不同角色允许查看不同的数据列,对数据的增、删、查、改都有非常细致的限制,我们还需要再对权限系统进行更大的扩展,来实现更细粒度的权限管理。

比如说我们的部门编码是如下规则(实际项目中,部门划分可能有很大的区别,而要实现跨部门跨权限查询,那又是另外的算法了):

01XX公司0101CEO010101财务部010201销售部01020101华南地区分公司0102010101广东地区0102010102广西地区0102010103海南地区01020102华北地区分公司0102010201北京地区0102010202天津地区0102010203 河北地区

所有的订单和销售数据都必须绑定对应的部门编码,这样我们在做数据统计时,就可以通过当前用户所在位置的编码+%方式组合sql语句进行查询筛选,限制用户只能查看自己分管部门以下的所有数据,而不能跨部门或跨权限查询到高一级部门的数据。这种方式对于数据量不算太大的项目来说,它是最简单的最容易实现的管理方式。

当然要实现类似的数据权限管理功能方式有很多,这里就不一一讨论了。

在实际开发中,业务的不一样,权限需求可能是千奇百怪,什么样的需求都可能有,这就需要我们深入的去分析需求,结合系统功能模块,设计出对应的权限管理系统,以满足不同企业的权限管理需要。

版权声明:本文原创发表于 博客园,作者为

python开发QQ群:669058475(本群已满)、733466321(可以加2群) 作者博客:http://www.cnblogs.com/EmptyFS/

python开发企业管理平台_我的第一个python web开发框架(34)——后台管理系统权限设计...相关推荐

  1. pythonweb开发工作内容_我的第一个python web开发框架(5)——开发前准备工作(了解编码前需要知道的一些常识)...

    中午吃饭时间到了,小白赶紧向老菜坐的位置走过去. 小白:老大,中午请你吃饭. 老菜:哈哈...又遇到问题了吧,这次得狠狠宰你一顿才行. 小白:行行行,只要您赏脸,米饭任吃,嘻嘻,我们边走边聊. ... ...

  2. python开发环境对比_【整理】各种Python的IDE(集成开发环境)的总结和对比 | 在路上...

    背景 之前已经写帖子,解释了关于Python的开发环境: 但是,对于Python的IDE方面,介绍的不是很多. 此处,专门整理了,各种Python的IDE. 各种Python的IDE PyScript ...

  3. python定制框架知识点_我的第一个python web开发框架(25)——定制ORM(一)

    在开始编写ORM模块之前,我们需要先对db_helper进行重构,因为ORM最终生成的sql是需要转给db_helper来执行的,所以拥有一个功能完善.健壮的数据库操作类是非常必要的. 这是项目原db ...

  4. python怎么开始编程_如何开始第一个 Python 编程实践项目?

    导语:上期我们谈了谈如何高效的入门 Python 编程,了解了 Python 的编程环境以及常用的包,如 Pandas.Matplotlib.Numpy 等.这次我们将以实践项目的形式,帮助大家快速的 ...

  5. python中datetime库_一天掌握一个Python库--datetime库

    #一天掌握一个Python库--datetime库 **datatime** 模块题共用一些处理日期,时间和时间间隔的函数.这个模块使用面向对象的交互取代了**time**模块中整形/元组类型的时间函 ...

  6. python开发项目管理平台_基于Python的软件项目管理系统.doc

    摘要:软件项目管理系统是为了使软件能按照预定的进度和质量顺利完成,而针对开发人员进行管理的系统,目的是使开发人员通力合作,相互配合,以低成本完成目标.系统包括项目开发人员基本信息管理.软件进度查看和软 ...

  7. python开发office插件_看完这篇Python操作PPT总结,从此使用Python玩转Office全家桶就没有压力了!...

    一.导读 大家好,今天依旧是Python办公自动化基础系列,在之前我们分别详细讲解了 今天本文将基于第三方库pptx,详细讲解如何使用Python操作Office全家桶最后一位--PPT. 二.安装 ...

  8. 基于百度地图的python开发服务端_百度地图api用python行吗

    ?ak=E4805d16520de693a3fe707cdc962045 &callback=renderReverse &location=39.983424,116.322987 ...

  9. python如何调用文件_如何调用另一个python文件中的代码

    原博文 2017-07-10 15:56 − 无论我们选择用何种语言进行程序设计时,都不可能只有一个文件(除了"hello world"),通常情况下,我们都需要在一个文件中调用另 ...

最新文章

  1. NND年年回家这么难买火车票
  2. DOM0,DOM2,DOM3事件,事件基础知识入门
  3. 你还傻傻的分不清“和服和浴衣吗?
  4. android 自定义键盘字体大小,android.inputmethodservice.KeyboardView 自定义键盘 字体大小设置...
  5. 计算机技术在农机上的应用,计算机视觉技术在农机自动化上的应用与优势分析.pdf...
  6. 摄像头拍摄后对图片进行图像处理-python(空域增强)
  7. 读取数据库并写入excel表中 发送邮件
  8. 我的github网址链接
  9. mysql addslashes c_addslashes()用途与php怎样防止mysql注入?
  10. 深度学习----一文搞懂激活函数(Sigmoid/ReLU/LeakyReLU/PReLU/ELU)
  11. php向redis list一次性lpush多个值
  12. 查看本地硬盘raid级别linux,linux 下查看硬盘型号、大小等信息(含Raid)
  13. JavaScript使用手册、范例
  14. 解决hashcat报错
  15. 较于微信红包,支付宝AR红包是个好产品吗?
  16. 电脑自动开机是什么原因
  17. 微信小程序 - [完整源码] 全屏左右菜单联动效果,左侧分类与右侧内容联动,类似美团饿了么的点餐页面 “左边菜单,右边内容“ 效果(开箱即用的示例源码,代码干净整洁且注释详细)
  18. java 里面耦合和解耦
  19. 订单查询系统c语言作业,C语言设计订单管理系统答题.doc
  20. 曼昆宏观经济学第8版笔记及课后答案

热门文章

  1. 使用IntelliJ IDEA 15和Maven创建Java Web项目
  2. tornado 09 cookie和session
  3. 2、redis.conf基本配置项说明
  4. js高级程序设计(六)面向对象
  5. 源码编译安装percona-xtrabackup-2.3.2
  6. Java两种排序方式快慢比较
  7. CentOS6.8下安装Docker
  8. Kafka 六战 RabbitMQ,这差距还不够明显吗?
  9. 闲鱼单体应用Serverless化拆分实践
  10. 本科毕业的互联网女主管,却被迫要嫁给开挖掘机的高中毕业生!这是咋回事?...