框架底层和接口终于改造完成了,小白再次找到老菜。python
小白:老大,上次你对后台权限系统简单的讲了一下,我一点头绪都没有,如今有空完整的说一说吗?ajax
老菜:说到权限系统,要讲明白真不容易,权限系统并非越复杂越好,要根据项目的须要而定,有的系统只有几我的操做,并无必须使用功能强大且复杂的权限管理系统;而有的大型企业,各地区存在分公司,业务与销售数据分级管理,系统数据甚至须要不一样角色容许查看不一样的数据列,对数据的增、删、查、改都有很是细致的限制,这就须要使用对应的功能强大的权限管理模块,来处理不一样的业务需求。算法
下面我用多张图按部就班的方式来讲明一下权限系统的演变。sql
首先咱们来看看最简单的权限系统是怎么管理的后端
最简单的权限系统,它只须要验证用户帐号与密码是否正确就能够了,进入系统后经过检查session是否失效,来判断用户是否退出,登陆进入系统后,全部功能项都开放给用户操做。api
相对于前面一种权限,稍微复杂点的权限管理,它只须要管理到菜单级别,简单的对于页面的访问不作控制,复杂点的也只须要在全部连接中,根据访问url生成对应的加密串,在被访问页面的相关接口使用一样的密钥与规则,生成对应的加密串,而后比较两个加密串是否一致就能够防止绝大部分的非法访问了。服务器
这种权限管理,须要增长菜单(主键id、菜单名称、页面url、排序、是否启用、建立时间)和菜单权限管理功能。菜单和页面url的加密处理,在返回菜单时能够由服务器统一辈子成传回给客户端,客户端只有经过服务器端生成的url才能进入对应的页面。至于怎么作到加密串识别的,能够经过下面方式进行处理:session
用户登陆后自动生成惟一的由大小写字母和数字组成的标识串作为密钥,而后加上时间戳、被访问页面名称、ip、页面访问参数(好比id值等),用md5加密生成一个加密串,而后将加密串和时间戳、页面访问参数等内容组合成url参数,生成能够访问的url。当用户点击该url访问时,被访问页面接收到这些参数后,经过同样的加密次序进行处理,生成一样的加密串与提交过来的加密串进行比较,就能够识别用户有没有权限访问该页面了。用户经过擅改页面名称或访问参数,被访问页面能够很容易检查到加密串不一致而拒绝访问,能够轻易作到用户只能经过指定url才能访问页面。由于用户不知道密钥是什么,因此他很难进行造假访问无权限访问的页面。框架
这样处理看起来好像很复杂的样子,实际上开发起来很简单,且只须要一个菜单与菜单权限表,菜单权限表将菜单和管理员帐号绑定起来,受权指定管理能够访问的菜单项,权限管理相对来讲很是简单且容易实现。前后端分离
对于上面这种权限,它没法控制页面按键,也就是说它没法控制增删改查等各类操做,因此就延伸出下面这种权限管理方法。
对于先后端分离的系统来讲,页面列表数据查看、新增、修改、删除等各类操做,都须要经过ajax将数据或参数提交给对应的接口,而后接口再将运算的结果返回回来,因此咱们能够经过限制接口的访问来作到对页面按键功能的控制。
对于这种权限管理,咱们只须要在前面的菜单管理功能中进行扩展就能够实现了,在菜单表(主键id、菜单名称、页面url、排序、是否启用、建立时间)中增长上一级菜单id、接口路由地址、是否显示这几个字段就能够了。
因为须要增长页面按键对应的接口控制,为了让菜单分级展现页面与按键绑定的关系,因此须要添加父级菜单id,而接口中路由地址这个字段,熟悉python的bottle框架的小伙伴,能够很清晰的知道每一个接口都是经过咱们本身设置的路由来访问的,好比说前面获取产品指定主键id实体的地址
@get('/api/product/<id:int>/') def callback(id): """ 获取指定记录 """
@get('/api/product/<id:int>/') 这个就是url访问的路由地址,这些路由地址在整个项目中都是惟一的,且接口被访问时咱们很容易直接获取到这个路由标识。因此在开发时,咱们能够在底层直接作个拦截,经过判断用户是否有勾选这个路由对应的菜单项,来查看用户是否有访问该接口的权限。
而是否显示字段,主要是为了菜单列表输出时,将这些按键项隐藏,不直接在菜单中显示出来。
而用户权限的管理,跟前面的同样,只须要管理员帐号绑定能够访问的菜单项就好了。
对于人员比较多,且人员流动比较频繁的企业来讲,使用前面的权限管理起来,会很麻烦。由于人员流动后,须要常常对权限进行相应的调整,不管是新员工入职仍是员工更换岗位,都须要从新设置对应的管理员访问权限。为了使权限管理起来更加简单化,这时须要引入职位(角色)与部门(权限组)的概念。对于企业来讲,职位比角色更容易理解,不一样的职位有不一样的工做职责,对于企业的管理系统操做来讲也是同样的,不一样的职位也有不一样的操做权限。而部门主要是为了方便对职位进行分组管理,由于职位多时没有对应的分组,查询不方便,若是有类似的职位,也容易混淆。
对于企业来讲,人员因为流动关系可能会常常变化,而职位则相对来讲是比较固定的,因此权限由前面直接绑定管理员,改成菜单权限绑定职位。当一位员工更换岗位时,只须要更改他所绑定的职位,对于新入职的员工,也只须要绑定他所入职岗位,他们就能够拥有该职位的全部权限。
固然也会存在一些特殊的须要,好比说某人与同事都隶属于同一个职位,但他是老员工能够拥有更多的权限,这时能够增长一个新职位(经过制定职位级别)来区分他们的权限。
又好比说,若是权限须要限制部门访问权限,而该部门内的职位只能设置当前部门对应的权限,若是有员工须要跨部门拥有其余权限时,能够经过更改管理帐号绑定多职位的方式来实现,也就是说一个员工他只能够绑定一个主部门,但他能够同时拥有多个职位,而后享有多个职位共有的权限。
对于常见的企业权限需求来讲,这个权限设置就能够知足大部分项目的要求了,后面章节会重点介绍当前这个权限管理体系。
有些项目在权限上可能还有其余方面的特殊需求,好比说前面的权限管理它们都是页面的访问控制,若是想要对页面的查看项和可操做项进行更细一步的控制时,它们就作不到了,这时咱们就须要引入新的权限管理体系。
好比说企业内部的文档系统,全部用户对于本身部门或拥有权限的内容都有查看、新增、修改、删除、归档等操做权限,使用按键没法对这些权限进行细分控制。
这时能够建立一个文档权限管理表来专门管理这些操做权限,经过将文档分类记录与职位绑定的方式,在用户查看或操做这些文档时,检查该用户是否拥有对应的权限来进行权限管理。这种权限管理通常是前面权限管理功能的扩展,能够灵活管理各类不一样的权限需求。
若是你的系统想要应用到那些大型的企业中,就像前面所讲到的,须要对各地区分公司,业务与销售数据要求分级管理,系统数据甚至须要不一样角色容许查看不一样的数据列,对数据的增、删、查、改都有很是细致的限制,咱们还须要再对权限系统进行更大的扩展,来实现更细粒度的权限管理。
好比说咱们的部门编码是以下规则(实际项目中,部门划分可能有很大的区别,而要实现跨部门跨权限查询,那又是另外的算法了):
01 XX公司 0101 CEO 010101 财务部 010201 销售部 01020101 华南地区分公司 0102010101 广东地区 0102010102 广西地区 0102010103 海南地区 01020102 华北地区分公司 0102010201 北京地区 0102010202 天津地区 0102010203 河北地区
全部的订单和销售数据都必须绑定对应的部门编码,这样咱们在作数据统计时,就能够经过当前用户所在位置的编码+%方式组合sql语句进行查询筛选,限制用户只能查看本身分管部门如下的全部数据,而不能跨部门或跨权限查询到高一级部门的数据。这种方式对于数据量不算太大的项目来讲,它是最简单的最容易实现的管理方式。
固然要实现相似的数据权限管理功能方式有不少,这里就不一一讨论了。
在实际开发中,业务的不同,权限需求多是千奇百怪,什么样的需求均可能有,这就须要咱们深刻的去分析需求,结合系统功能模块,设计出对应的权限管理系统,以知足不一样企业的权限管理须要。
版权声明:本文原创发表于 博客园,做者为 AllEmpty 本文欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然视为侵权。
python开发QQ群:669058475(本群已满)、733466321(能够加2群) 做者博客:http://www.cnblogs.com/EmptyFS/