实现业务系统中的用户权限管理--实现篇
在设计篇中,我们已经为大家阐述了有关权限管理系统的数据库设计。在本篇中,我们将重点放在事实上现代码部分。
为了让你可以更直接更有效的看到所有动作的代码。我们使用“动作分解列表”的方式来陈述每一个动作以及相关资源。
实现权限管理功能的动作
动作分解 | 动作名 | 相关表名 | 操作集类型 (S,U,I,D,SQL) |
表单 | 模组 | 字符资源 | 是否分页? | 返回提示? | 权限检測 |
权限初始化安装 | setup | 无 | 无 | 无 | setup | setupok | 否 | 否 | 否 |
显示加入管理组界面 | addnewgroup | 无 | 无 | addgroup | checkuserpurview | 无 | 否 | 否 | 是 |
运行加入管理员动作 | addnewgroup_ex | gorupmanager、gorupmanager、mastergroup | S、I、I | 无 | checkuserpurview | 否 | 是 | 是 | |
显示全部管理组列表以运行设置权限动作 | setgroupinfo | 无 | 无 | 无 | checkuserpurview | 是 | 否 | 是 | |
显示设置管理组权限界面 | setgroupinfo_input | 无 | 无 | 无 | checkuserpurview | 否 | 否 | 是 | |
运行设置管理组权限动作 | setgroupinfo_ex | actiongroup、action、actiongroup | D、S、I | 无 | checkuserpurview | 否 | 否 | 是 | |
运行删除管理组动作 | delgroup_ex | groupmaster、actiongroup | D、D | 无 | 是 | 是 | 是 | ||
显示全部管理组列表以运行查看管理组成员动作 | viewgroupmaster | 无 | 无 | 无 | checkuserpurview | 是 | 否 | 是 | |
查看所选择管理组下的全部成员 |
viewmaster | 无 | 无 | 无 | checkuserpurview | 是 | 否 | 是 | |
显示加入管理员界面 |
addnewmaster | 无 | 无 | addnewmaster | checkuserpurview | 无 | 否 | 否 | 是 |
运行加入管理员动作 | addnewmaster_ex | master、master、mastergroup | S、I、I | 无 | checkuserpurview | 否 | 是 | 是 | |
显示全部管理员列表以运行设置管理员权限动作 | setmasterpurview | 无 | 无 | 无 | checkuserpurview | 是 | 否 | 是 | |
查看所选择管理员所在管理组 | setmasterpurview_input | 无 | 无 | 无 | checkuserpurview | 是 | 否 | 是 | |
运行设置所选管理员权限 |
setmasterpurview_ex | mastergroup、mastergroup | D、I | 无 | checkuserpurview | viewtitle do_ok loginjumpframe |
否 | 是 | 是 |
显示全部管理员列表以运行设置管理员password动作 | setmasterpass | 无 | 无 | 无 | checkuserpurview | 是 | 否 | 是 | |
显示password改动界面 |
setmasterpass_input | 无 | 无 | masterpassword | checkuserpurview | 无 | 否 | 否 | 是 |
运行改动管理员password动作 |
setmasterpass_ex | master | SQL | 无 | checkuserpurview | viewtitle do_ok |
否 | 是 | 是 |
显示全部管理员列表以运行改动管理员信息动作 |
setmasterinfo | 无 | 无 | 无 | checkuserpurview | 是 | 否 | 是 | |
显示所选择管理员信息改动界面 |
setmasterinfo_input | master | S | editmasterinfo | checkuserpurview | del_confirm | 否 | 否 | 是 |
运行改动管理员信息动作 |
setmasterinfo_ex | master | U | 无 | checkuserpurview | viewtitle do_ok list_allmaster |
是 | 是 | 是 |
运行删除管理组动作 | delmaster_ex | master、actiongroup | D、D | 无 | 否 | 是 | 是 | ||
运行改动当前管理员password动作 | setmyinfo_ex | master | U | 无 | 无 | 否 | 是 | 是 | |
显示改动当前管理员信息界面 | setmyinfo | master | S | editmasterinfo | 无 | 无 | 否 | 是 | 是 |
运行改动当前管理员password动作 | setmypass_ex | master | SQL | 无 | 无 | 否 | 是 | 是 | |
显示改动当前管理员password界面 | setmypass | 无 | 无 | masterpassword | 无 | 无 | 否 | 否 | 是 |
系统动作
动作分解 | 动作名 | 相关表名 | 操作集类型 (S,U,I,D,SQL) |
表单 | 模组 | 字符资源 | 是否分页? | 返回提示? | 权限检測 |
当管理员第一次进入管理系统时将使用该动作 | * | 无 | 无 | login | 无 | 无 | 否 | 否 | 否 |
系统登录动作。管理员登录系时将使用该动作 | login | master | SQL | 无 | 无 | 否 | 是 | 否 | |
显示窗体TITLE信息 | viewtoolstitle | 无 | 无 | 无 | 无 | managertitle | 否 | 是 | 否 |
显示左工具条 | list_tools | 无 | 无 | 无 | 无 | 无 | 否 | 是 | 否 |
任务系统(预留) | autoviewtask | ||||||||
当用户未进行登录而运行动作时会引发该动作 | nosession | 无 | 无 | 无 | 无 | 否 | 是 | 否 | |
当用户进行删除操作时未点击确认时会引发该动作 | nopointid | 无 | 无 | 无 | 无 | nopointid | 否 | 是 | 否 |
当用户试图运行自己没有权限运行的动作时会引发该动作 | nopurview | 无 | 无 | 无 | 无 | nopurview | 否 | 是 | 否 |
退出系统 | outlogin | 无 | 无 | 无 | 无 | 否 | 是 | 否 |
具体解释模组:
1.setup(数据库初始化、权限设置模组)
当布署好一个新的系统后。我们能够通过运行一个动作setup来安装数据库和一些初始值,通过运行这个动作系统能够正常运行。由于运行setup这个动作时会调用到一个名称为setup的模组,这个模组的作用是初始化系统所用到的数据库。而且在系统中设置动作的权限。否则数据库和有权限的动作就没办法运行。
以下我们来看一下setup模组的代码,点击这里查看代码。
这里我们把代码拆分开看一下,由于setup模组里有好多类似的代码,所以这里我们仅仅找出不同功能的代码做一下介绍:
第一段:数据库安装
在模组中首先调用了一个datebase_SQL_setup这个数据库操作集。这个数据库操作集用来为系统中的数据库表(依据情况删除或新建)做初始化。
第二段:加入权限信息
代码中调用了action_I_newone这个数据库操作集,在这个操作集中增加权限的名称和它的其他信息。
第三段:加入一个管理员
这部分代码中调用了master_I_newone数据库操作集在数据库中加入了一个管理员的信息,这个信息是能够不写在这里的,能够直接在数据库中加入,可是为了降低不必要的麻烦所以直接在这里添入了一个默认的管理员。
第四段:加入管理员组
通过调用groupmanager_I_newmaster这个数据库操作集新建了一个管理员组,并增加了具体的管理员组信息,能够把新用户增加到此管理员组。
第五段:加入新的工具分栏
通过调用actioncolumn_I_newone数据库操作集在工具栏里增加一个工具栏分栏选项。
第六段:指定管理组
通过调用mastergroup_I_newone数据库操作集把admin这个用户增加到第一个管理组里。使该用户成为第一个管理组的成员。
最后一段:指定管理组拥有的权限
这段代码首先调用了action_S_all数据库操作集并使用Loop语句列出全部的动作,然后调用actiongroup_I_newone这个数据库操作集。把全部的动作都增加到第一个管理组里。使第一个管理组拥有全部权限。
这里之所以把数据库的安装和权限的设置都放在模组里面,是为了使用户使用更加方便,不须要再去又一次手动建库,以减不在数据库这方面的错误,使系统更加简单流畅。假设其他系统也须要权限这方面的管理。能够把模组稍做改动就能够直接拿来用。这样也体现出代码的重用性。
2.checkuserpurview(检验当前用户是否能运行该动作的模组)
在权限管理系统中,模组checkuserpurview得到了重复使用。该模组担负着检測用户权限的任务。在全部须要进行訪问权限控制的动作的開始部分都调用了该模组,所以理解该模组的代码也有一定难度。
以下,我们来看一看该模组的代码。
我们将整段代码拆分一下,首先看第一段,例如以下图:
推断_SESSION.myloginid的值是否为空,假设为空,在当前页面中运行nosession这个动作。我们在用户登陆的动作中login会为登陆的用户使用myloginid的SESSION变量记录下该用户的ID。因此假设用户是正常登陆并在SESSION有效期内的话,则_SESSION.myloginid的值是不可能为空的。通过此部分代码检測用户是否已经登陆成功并获得合法的訪问身份。
然后看以下的代码,例如以下图:
调用数据库操作集mastergroup_S_bymasterid。使用逻辑层的Loop,使用当前运行的action以及查询返回的groupid作为条件,调用数据库操作集actiongroup_S_byactionandgroupid进行循环查询。假设查询返回值大于0(零),将局部变量purview的值设置为1。
这段代码的重点在于使用的Loop进行循环,因为actiongroup表中记录着用户所处的管理组可以运行的权限。而且一个用户可能同一时候会属于多个组,因此我们须要去检验用户属于的多个组中是否有对该动作运行的权限,因此,我们使用当前须要运行的动作action以及用户所处的管理组groupid循环查询,当前用户所属于的组中仅仅要有一个组具有运行该动作的运行权限。则该用户就行运行该动作。
最后一部分代码例如以下图:
再次使用推断。假设purview的值不为1的话,则在当前页面运行nopurview动作。
因为之前的代码中。假设用户拥有运行动作的权限的话。会将局部变量purview的值设置为1。所以这里假设该变量值不为1。就说明了此用户没有运行动作的权限,故运行nopurview动作。
总结
从设计到实现,权限管理系统的教程到这里就所有结束了。在设计阶段,最重要也是最难理解的是那两张映射表的作用。理解了两张映射表。基本上也就理解了整套数据库的设计。
而实现阶段。比較难理解的就是上面说到的模组checkuserpurview了。
理解该模组。须要联合数据库设计。actiongroup表中记录着用户组能够运行的权限。使用action字段和groupid字段进行查询,返回的数大于1,说明了用户所在的组拥有运行该动作的权限。