对于一家有一定规模的网站平台,是不可能只有一个管理员的,会有很多人来管理,那后台需要有添加管理员的功能。在写这个功能前,我们还要思考些问题。那就是管理员与管理员之间有没有级别之分,答案是:肯定有!
这就好比一家公司,老总在公司的权利最大,可以招员工,开除员工,吩咐不同的员工做不同的事。假如这家公司的所有员工都去管理一个网站。老总在管理后台的权限应该是最大的,拥有“超级管理员”的身份,只有“超级管理员”才可以添加新管理员进来。老总这位“超级管理员”给客服人员添加(分配)管理员账号,肯定会对客服人员的管理员账号做权限设置,他们只能在后台操作与客服有关的功能(有权限的功能)。老总给财务人员添加管理员账号,也要对其做限制,他们只能操作与财务有关的功能。不可能说,一个小小的客服人员在后台能把公司的钱给转走了(前提假设网站有转账的功能),那岂不是乱套了。
一套程序,只要有会员体系,总免不了会有各种权限制约的功能。对于安全要求比较高的系统程序,安全不仅仅指的程序漏洞,还有功能的权限做的是否安全,是否起到了相互制约、相互隔离的作用。比方说在公司运作中,财务要打钱给其他公司,财务人员计算好以后,必须得经过领导的签字才可以打钱。如果网站系统中也有这样的转账功能,在权限方面也要做到操作与监督分离,同时需要两个管理员去操作转账,这样就会安全的多。
了解了这些,我们的后台操作一个功能,不仅要验证管理员登录状态,还要验证管理员的身份,以及管理员的操作权限。
接下来楠神开始写后台管理员权限分配的功能。思路:
假如公司员工很多,领导不可能一个一个给员工分配工作,肯定会说,“客服”该干什么,“运营”该干什么……员工自己对号入座,自己是客服身份就去做客服该做的工作,是运营就去做运营该做的工作。
结论:每个管理员需要有一管理组归属,每个管理组有一个权限列表。
所以,需要先创建一个管理组表
1)管理组表
创建管理组表后,对应在common模块model目录下创建管理组表的模型类。
先添加一个管理组,名称为“超级管理员”。
获取到这个管理组的ID为1,然后在admin配置文件中,加一个参数“super_group_id”,赋值为1。
这个参数在后面会用到。作用:id为1的管理组为超级管理组,该组下的管理员即为超级管理员。目前“楠神”这个管理员属于超级管理组。
2)创建权限配置文件
管理组有了,怎么给管理组赋予相应的权限呢?
首先说下,什么是权限?其实就是功能URL。后台的每一个功能都是URL,我们给每一个URL做好编号,一个管理组有哪些权限就把对应的URL编号放入“rules”字段。类似于这样:
楠神写了一个URL编号的配置文件(当然也可以写到数据库中)
权限检验的原理:
当管理员要访问URL为“test/action1”,先找到此URL所对应的编号,然后再去此管理员所在组的“rules”字段查看有没有此编号,如果有证明此用户组有这个URL权限,没有就表示此用户组没有权限。
3)权限扩展类
权限的验证后面还有很多,为了规范些,楠神定义了一个权限扩展类,各种权限验证的方法都定义在此类中。
定义了第一个验证方法“allowRequestAdminUrl”。
介绍:
这个方法主要验证了当前管理员是否有访问某个后台URL的权限。
参数URL为 “控制器/方法名”字符串,没有默认自动获取。
37行代码,楠神为什么对“index控制器”不做权限验证呢?
那是因为每个后台管理员都需要有修改自己资料、查看自己登陆日志的功能。每个管理员都应该有的功能,全部写到“index控制器”中,所以就对“index控制器”的方法不做权限验证了。
有了这个方法,我们就可以对写过的代码做下修改了
①对当前访问的URL做验证
②对菜单URL做验证
这样权限的功能就写完了。
4)演示下
使用“楠神2”登陆后
“栏目二”的“action6”、“action7”、“action8”菜单都没有显示出来,说明菜单URL验证是成功的。
直接输入URL请求,“test/action5”楠神2是没有权限访问的,验证也成功了。
“test/action4”楠神2有权限访问
这节内容到此结束,权限验证功能楠神已写出来了,下节开始讲怎么在程序中分配权限。