框架底层和接口终于改造完成了,小白再次找到老菜。
小白:老大,上次你对后台权限系统简单的讲了一下,我一点头绪都没有,现在有空完整的说一说吗?
老菜:说到权限系统,要讲明白真不容易,权限系统并不是越复杂越好,要根据项目的需要而定,有的系统只有几个人操作,并没有必须使用功能强大且复杂的权限管理系统;而有的大型企业,各地区存在分公司,业务与销售数据分级管理,系统数据甚至需要不同角色允许查看不同的数据列,对数据的增、删、查、改都有非常细致的限制,这就需要使用对应的功能强大的权限管理模块,来处理不同的业务需求。
下面我用多张图循序渐进的方式来说明一下权限系统的演变。
首先我们来看看最简单的权限系统是怎么管理的
最简单的权限系统,它只需要验证用户账号与密码是否正确就可以了,进入系统后通过检查session是否失效,来判断用户是否退出,登录进入系统后,所有功能项都开放给用户操作。
相对于前面一种权限,稍微复杂点的权限管理,它只需要管理到菜单级别,简单的对于页面的访问不做控制,复杂点的也只需要在所有链接中,根据访问url生成对应的加密串,在被访问页面的相关接口使用同样的密钥与规则,生成对应的加密串,然后比较两个加密串是否一致就可以防止绝大部分的非法访问了。
这种权限管理,需要增加菜单(主键id、菜单名称、页面url、排序、是否启用、创建时间)和菜单权限管理功能。菜单和页面url的加密处理,在返回菜单时可以由服务器统一生成传回给客户端,客户端只有通过服务器端生成的url才能进入对应的页面。至于怎么做到加密串识别的,可以通过下面方式进行处理:
用户登录后自动生成唯一的由大小写字母和数字组成的标识串做为密钥,然后加上时间戳、被访问页面名称、ip、页面访问参数(比如id值等),用md5加密生成一个加密串,然后将加密串和时间戳、页面访问参数等内容组合成url参数,生成可以访问的url。当用户点击该url访问时,被访问页面接收到这些参数后,通过一样的加密次序进行处理,生成同样的加密串与提交过来的加密串进行比较,就可以识别用户有没有权限访问该页面了。用户通过擅改页面名称或访问参数,被访问页面可以很容易检查到加密串不一致而拒绝访问,可以轻易做到用户只能通过指定url才能访问页面。因为用户不知道密钥是什么,所以他很难进行造假访问无权限访问的页面。
这样处理看起来好像很复杂的样子,实际上开发起来很简单,且只需要一个菜单与菜单权限表,菜单权限表将菜单和管理员账号绑定起来,授权指定管理可以访问的菜单项,权限管理相对来说非常简单且容易实现。
对于上面这种权限,它无法控制页面按键,也就是说它无法控制增删改查等各种操作,所以就延伸出下面这种权限管理方法。
对于前后端分离的系统来说,页面列表数据查看、新增、修改、删除等各种操作,都需要通过ajax将数据或参数提交给对应的接口,然后接口再将运算的结果返回回来,所以我们可以通过限制接口的访问来做到对页面按键功能的控制。
对于这种权限管理,我们只需要在前面的菜单管理功能中进行扩展就可以实现了,在菜单表(主键id、菜单名称、页面url、排序、是否启用、创建时间)中增加上一级菜单id、接口路由地址、是否显示这几个字段就可以了。
由于需要增加页面按键对应的接口控制,为了让菜单分级展示页面与按键绑定的关系,所以需要添加父级菜单id,而接口中路由地址这个字段,熟悉python的bottle框架的小伙伴,可以很清晰的知道每个接口都是通过我们自己设置的路由来访问的,比如说前面获取产品指定主键id实体的地址