教务管理系统之权限理解.docx
《教务管理系统之权限理解.docx》由会员分享,可在线阅读,更多相关《教务管理系统之权限理解.docx(10页珍藏版)》请在冰豆网上搜索。
教务管理系统之权限理解
教务管理系统之权限理解
1.RBAC模型
NIST的RBAC基本模型,用户角色权限,三层控制,用户不能直接的被赋予权限。
2.教务管理系统权限实例
2.1运用原理
基本模型是RBAC模型,但是还有一个模块控制没有纳入到教务管理权限的模型中来。
其基本元素是放在数据库中的某一张表中,通过方便的SQL语言进行查询分析得到相应的权限、角色、用户。
在每个模块中都定义了一个Action集合,这个集合表示了当前子系统的所有权限,要使这些权限可以分配,必须要在2.2.3权限表建立相应的记录。
在用户登录系统后,将根据用户、角色、权限等表得到用户的权限,设置这些权限为Enable和Visable,而除去这些权限的Action集合将设置为默认的Disable和Inviable。
也就是说,除非拥有该权限,否则都是不可用的。
这就是为什么系统要将控制的权限都做入到一个通用的Action中,实际是方便了系统的权限控制。
2.2实例分析
2.2.1用户表
名称:
T_UserLogin表
例如下面一条记录
winder刘波CDBC71职务移动电话办公室电话住宅地址家庭地址备注NULL0
2.2.2角色表
名称:
T_Part表
例如下面一条记录:
test测试testrole
2.2.3权限表
名称:
T_PopedomManage
例如下面一条记录:
KSMTTZReportKWGLManage打印考试命题通知ActionKSMTTZReportKWGLReportNULLNULL
2.2.4用户角色表
名称:
T_PartLogin
其中字F_PartID、T_UserID分别对应用户表和角色表中相应的字段,一个用户可以拥有多个角色,一个角色也可以赋予个多个用户。
例如下面一条记录:
testwinderNULL
2.2.5角色权限表
名称:
T_Popedom
例如下面一条记录:
KSMTTZReporttest
2.2.6用户功能表
名称:
T_System
例如下面的记录:
KWGLManageliaojuanNULL
RecruitliaojuanNULL
XSScoreManagecliaojuanNULL
CWGLManageliaojuanNULL
DFGLManageliaojuanNULL
JHGLliaojuanNULL
StudentliaojuanNULL
SystemliaojuanNULL
XSScoreManageliaojuanNULL
2.2.7系统模块表
名称:
T_SystemManage
例如下面的记录:
JHGL教学计划管理教学计划管理ActionJHGLManageNULL
JXGL分校教学管理分校教学管理ActionJXGLManageNULLNULL
System系统管理系统管理ActionSystemManageNULL
Recruit招生管理招生管理ActionRecruitManageNULL
Student学籍管理学籍管理ActionStudentManageNULL
KWGLManage考务管理考务管理ActionKWGLManageNULL
XSScoreManage学生成绩管理学生成绩关联ActionXSScoreManageNULL
CWGLManage财务管理财务管理ActionCWGLManageNULL
DFGLManage登分管理登分管理ActionDFGLManageNULL
2.3权限控制过程
下图是整个权限控制流程关系:
2.3.1建立用户
在程序中由所体现,是在用户管理中。
是在T_UserLogin用户表中插入一条记录,登记用户的基本信息,其用户名称不能重复。
2.3.2建立角色
在程序中由所体现,是在角色管理中。
是在T_Part角色表中插入一条记录,登记角色的基本信息,其角色名称不能重复。
2.3.3建立权限
在程序中并没有体现,但可以通过数据接口导入。
是在T_PopedomManage表中插入一条记录,登记权限的基本信息。
2.3.4分配角色给用户-用户管理
在程序中由所体现,是在用户管理中。
为已经存在的用户分配角色,删除角色,主要针对的是T_PartLogin用户角色表。
2.3.5分配权限给角色-角色管理
在程序中由所体现,是在角色管理中。
为已有的角色分配权限,主要针对T_Popedom角色权限表。
2.4其他控制
主要针对这样的现实环境:
整个教务系统是由考务、学生等多个子系统构成的,每个子系统都可以独立运行,为了在整个教务系统登录过程中控制用户能使用那些子系统,这里加入了模块控制的过程,其原理与2.3权限控制是基本类似的。
这里的模块体现了权限层次的根,而T_System的存在是为了加速反映用户所拥有的根模块权限,他应该可以由权限表和模块表组合得到。
2.4.1建立系统模块表
在程序中没有体现功能,但可以通过数据接口导入
是在T_SystemManage系统模块表中插入记录,登记模块的基本信息。
为权限的层次定义一个起始点,也就是说所有的权限层次开始递归寻找是从这里开始的。
2.4.2建立用户模块表
在程序中没有体现功能,但可以通过数据接口导入
为已存在的用户分配模块功能,主要针对T_System表。
3.教务管理系统权限缺陷
3.1权限定义模糊
系统存在两处权限管理,其一是用户角色权限的RBAC模型;其二是用户系统模块;两者运用的管理分别是间接和直接管理,增加了系统理解的复杂度。
建议把系统模块表也加入到权限表中,也通过角色来管理。
3.2权限管理是静态的
系统的权限判断是刚登录进入的时候,根据权限关系把表中的数据取出,设定权限,然后根据这些权限来判断这个权限来禁止/允许这个功能的运行。
这时如果动态的修改某个权限后,并不能生效,而只有重启动系统才能有效。
建议在系统中构建系统动态权限判断系统,在执行某个操作时动态判断权限是否有效,可以通过提示或其他的方式来表示这个权限的有效性。
3.3权限层次管理不清晰
系统中定义了多处权限,权限之间应该由一定的层次关系,可以这样考虑,如果父权限都没有,怎样给予子权限都没有用的。
如考务管理报表输出成绩及格率就表示了三级控制关系,而在系统中可能直接有了成绩及格率权限就可以执行。
系统应该增加权限的一致性检查,在对应的表中提示这些非法权限的产生。
3.4权限分配机制有缺陷
系统在进行为用户分配角色的时候,把所有的角色都取出来了,而事实上没有考虑到当前登录的用户有没有这个权限来进行权限的管理。
建议:
可以设定只有某个用户或角色能进行权限的管理,或者是当前用户只能分配或回收自己拥有的权限给某个用户。
3.5权限的一致性问题
当角色的权限发生改变时,系统的流程是建议把为赋予了这个角色的用户都要从新提交,否则这项权限不会生效,这与RBAC模型中的责权分离相背离。
建议修改方式有两种,其一是当修改角色时候更新系统架构的用户权限表;其二是在进行权限判断的时候不用这张表或者是直接用7.1的方法得到用户的权限。
4.权限管理延伸
针对多层次、多级别的权限控制,可以用EORBAC模型来理解,而这种控制是相当复杂的。
详细原理可以参考文献。
5.权限管理延伸在教务系统中的实例
在本系统中,有了权限层次得概念,如模块就是代表顶级的根权限,而重要的是根据权限描述表得到的权限的对应关系。
5.1权限控制树
如2.2.3对该表的描述,F_SystemID就代表了改权限属于那个模块。
而F_ParentID代表了改权限的父节点是那个权限,它与F_FunctionID组成了权限控制树(可以通过根节点通过递归实现遍历)。
5.2根节点表
如2.2.7系统模块表的定义,这张表定义了多个根节点,由这些根节点分别遍历就组成了权限森林。
6.参考文献
7教务系统SQL语句
7.1得到用户的权限
其中默认的定义是不包括拥有的模块权限。
而从另外的表中得到。
selecta.userid,d.f_functionidfromt_userloginasa,t_partloginasb,t_partasc,t_popedomasd
wherea.userid='test'anda.userid=b.useridandd.f_partid=c.f_partidorderbya.userid
7.2得到用户的模块(根权限)
其一:
从多张表中的逻辑关系得到
selectdistincta.userid,e.f_systemidfromt_userloginasa,t_partloginasb,t_partasc,t_popedomasd,t_popedommanagease
wherea.userid=b.useridandd.f_partid=c.f_partidandd.f_functionid=e.f_functionidorderbya.userid
其二:
从用户模块表中得到
selectdistinctuserid,f_systemidfromt_systemorderbyuserid
因此存在着一致性检查,应该由方法一来统一控制。
7.3得到用户的角色
selecta.userid,b.f_partidfromt_userloginasa,t_partloginasborderbya.userid
7.4得到角色的权限
selecta.f_partid,b.f_functionid,b.f_functionnamefromt_popedomasa,t_popedommanageasbwherea.f_functionid=b.f_functionidorderbya.f_partid
7.5得到角色的用户
select*fromt_partloginorderbyf_partid