惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
Last Week in AI
Last Week in AI
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
H
Help Net Security
F
Fortinet All Blogs
MyScale Blog
MyScale Blog
宝玉的分享
宝玉的分享
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 司徒正美
量子位
N
Netflix TechBlog - Medium
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
Recorded Future
Recorded Future
博客园 - 三生石上(FineUI控件)
Vercel News
Vercel News
aimingoo的专栏
aimingoo的专栏
I
InfoQ
Microsoft Security Blog
Microsoft Security Blog
Scott Helme
Scott Helme
The Last Watchdog
The Last Watchdog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
AI
AI
WordPress大学
WordPress大学
Security Archives - TechRepublic
Security Archives - TechRepublic
Google Online Security Blog
Google Online Security Blog
U
Unit 42
V2EX - 技术
V2EX - 技术
MongoDB | Blog
MongoDB | Blog
Schneier on Security
Schneier on Security
博客园 - Franky
H
Heimdal Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Jina AI
Jina AI
W
WeLiveSecurity
P
Privacy & Cybersecurity Law Blog
Cloudbric
Cloudbric
B
Blog RSS Feed
N
News | PayPal Newsroom
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
I
Intezer
Hacker News - Newest:
Hacker News - Newest: "LLM"
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园_首页
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
雷峰网
雷峰网

博客园 - 四海

定时提醒助手 kettle 创建任务定时执行数据抽取 js 图形化工作流设计器 更新树层结构 工作流设计 jquery 固定行列可编辑表格-jfixed 简单实用ORM框架 oracle 数据库实体生成工具 Js 弹出框 返回值的两种常用方法 c#做的查看sybase数据库表 sql 查询执行顺序 转载网络ASP与SQL Server存储过程 有创业兴趣的来看看 一个有用的存储过程 marquee中嵌入datalist 滚动 XMLHttpRequest 对象 System.Web.HttpRequestValidationException:解决方法 实现业务系统中的用户权限管理--设计篇 Page.ClientScript.RegisterStartupScript()
实现业务系统中的用户权限管理--实现篇
四海 · 2008-12-12 · via 博客园 - 四海

在设计篇中,我们已经为大家阐述了有关权限管理系统的数据库设计,在本篇中,我们将重点放在其实现代码部分。为了让你能够更直接更有效的看到全部动作的代码,我们使用“动作分解列表”的方式来陈述每个动作以及相关资源。

实现权限管理功能的动作

动作分解 动作名 相关表名 操作集类型
(S,U,I,D,SQL)
表单 模组 字符资源 是否分页? 返回提示? 权限检测
权限初始化安装 setup setup setupok
显示添加管理组界面 addnewgroup addgroup checkuserpurview
执行添加管理员动作 addnewgroup_ex gorupmanager、gorupmanager、mastergroup S、I、I checkuserpurview

addok
adderror

显示所有管理组列表以执行设置权限动作 setgroupinfo checkuserpurview

viewtitle
list_allgroup

显示设置管理组权限界面 setgroupinfo_input checkuserpurview

viewtitle
list_allgrouppurview
del_confirm

执行设置管理组权限动作 setgroupinfo_ex actiongroup、action、actiongroup D、S、I checkuserpurview

setgrouppurview
loginjumpframe

执行删除管理组动作 delgroup_ex groupmaster、actiongroup D、D

checkuserpurview checkpointid

viewtitle
do_ok
list_allgroup

显示所有管理组列表以执行查看管理组成员动作 viewgroupmaster checkuserpurview

viewtitle
list_allgroup

查看所选择管理组下的所有成员

viewmaster checkuserpurview

viewtitle
list_groupmaster

显示添加管理员界面

addnewmaster addnewmaster checkuserpurview
执行添加管理员动作 addnewmaster_ex master、master、mastergroup S、I、I checkuserpurview

addok
adderror

显示所有管理员列表以执行设置管理员权限动作 setmasterpurview checkuserpurview

viewtitle
list_allmaster

查看所选择管理员所在管理组 setmasterpurview_input checkuserpurview

viewtitle
list_mastergroup

执行设置所选管理员权限

setmasterpurview_ex mastergroup、mastergroup D、I checkuserpurview viewtitle
do_ok
loginjumpframe
显示所有管理员列表以执行设置管理员密码动作 setmasterpass checkuserpurview

viewtitle
list_allmaster

显示密码修改界面

setmasterpass_input masterpassword checkuserpurview

执行修改管理员密码动作

setmasterpass_ex master SQL checkuserpurview viewtitle
do_ok

显示所有管理员列表以执行修改管理员信息动作

setmasterinfo checkuserpurview

viewtitle
list_allmaster

显示所选择管理员信息修改界面

setmasterinfo_input master S editmasterinfo checkuserpurview del_confirm

执行修改管理员信息动作

setmasterinfo_ex master U checkuserpurview viewtitle
do_ok
list_allmaster
执行删除管理组动作 delmaster_ex master、actiongroup D、D

checkuserpurview checkpointid

viewtitle
do_ok
list_allmaster

执行修改当前管理员密码动作 setmyinfo_ex master U

viewtitle
do_ok

显示修改当前管理员信息界面 setmyinfo master S editmasterinfo
执行修改当前管理员密码动作 setmypass_ex master SQL

viewtitle
do_ok

显示修改当前管理员密码界面 setmypass masterpassword

系统动作

动作分解 动作名 相关表名 操作集类型
(S,U,I,D,SQL)
表单 模组 字符资源 是否分页? 返回提示? 权限检测
当管理员第一次进入管理系统时将使用该动作 * login
系统登录动作,管理员登录系时将使用该动作 login master SQL

loginok
loginjumpframe
loginerror

显示窗口TITLE信息 viewtoolstitle managertitle
显示左工具条 list_tools
任务系统(预留) autoviewtask                
当用户未进行登录而执行动作时会引发该动作 nosession

nosession
nosessionjumpframe

当用户进行删除操作时未点击确认时会引发该动作 nopointid nopointid
当用户试图执行自己没有权限执行的动作时会引发该动作 nopurview nopurview
退出系统 outlogin

loginout
nosessionjumpframe

详解模组

  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,说明了用户所在的组拥有执行该动作的权限。

附录

MYSQL版本权限管理系统源码下载

MSSQL版本权限管理系统源码下载