




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕业设计说明书通用权限管理系统设计与开发软件学院0821940246葛飞霞学生姓名:学号:软件学院0821940246葛飞霞软件技术学院:软件技术冯传春专业:冯传春指导教师:2021年6月通用权限管理系统设计与开发 摘要权限管理一直以来都是每个应用系统不可缺少的局部,而且几乎是每个应用系统都重新对系统的权限进行重新设计,以满足不同系统用户的需求,目前很少对权限管理形成一套通用、灵活、完全可复用且易嵌入应用系统的组件模块。本文实现了一个通用的权限管理系统。该系统可以实现通用权限管理,能够用于任何需要使用权限管理的系统,使得其他系统的开发事倍功半,提高代码重用率,节省时间,提高开发效率。本论文从系统需求分析、总体设计、详细设计、系统实现和系统测试这五个角度对系统的开发过程进行了详细的介绍,并对该系统的主要特点以及采用的主要开发工具进行了简单的介绍。关键词:权限管理,JSP,SQLServerUniversalRightsManagementSystemDesignandDevelopmentAbstractRightsmanagementsystemforeachapplicationhasbeenanintegralpartof,andalmosteveryapplicationonthesystemofprivilegesarere-re-designedtomeettheneedsofusersofdifferentsystems,thereislittleontheformationofacommonsetofrightsmanagement,flexible,fullyreusableandeasytoembeddedapplicationsystemcomponentmodules.Thisarticleimplementsageneralrightsmanagementsystem.Thesystemcanachieveuniversalrightsmanagement,canbeusedforanyneedtouserightsmanagementsystem,makingthedevelopmentofothersystems,duplicationofefforts,improvecodereuse,tosavetimeandimprovedevelopmentefficiency.
Thethesisfromsystemrequirementsanalysis,design,detaileddesign,systemtestingandsystemtoachievethefivepoint,carryondetailedintroduction.Andcombinedtocarryonsimpleintroductiontothemaincharacteristicsofthatsystemandthemainsystemdevelopmenttools.KeyWords:Generalrightsmanagement,JSP,SQLServer目录TOC\o"1-3"\h\z1引言 1编写目的 1工程背景及历史意义 12系统开发工具介绍 32.1SQL简介 32.2JSP技术 42.3Tomcat 63系统规划与系统分析 73.1根本概念 7权限控制的根本原理 83.3数据库需求分析 114系统设计与实现 124.1系统设计 124.1.1数据库设计 124.1.2权限类设计 134.2系统实现 194.2.1权限类实现 194.2.2用户列表实现 374.2.3用户权限实现 395系统测试 41测试环境 41测试过程 415.3测试结果 426软件开发中主要解决的问题 43数据库的平安性 43模块的独立性 44结论 46参考文献 48致谢 491引言权限管理一直以来都是每个应用系统不可缺少的局部,而且几乎是每个应用系统都重新对系统的权限进行重新设计,以满足不同系统用户的需求,目前很少对权限管理形成一套通用、灵活、完全可复用且易嵌入应用系统的组件模块。本系统开发的目的,就是希望能够实现一个通用的权限管理系统。该系统可以实现通用权限管理,能够用于任何需要使用权限管理的系统,使得其他系统的开发事倍功半,提高代码重用率,节省时间,提高开发效率。及历史意义随着网络技术的迅速开展,电子商务,电子政务和商业应用系统等系统的开展不但需要保护系统资源不受侵犯,更需要为适当的访问者提供最大化的效劳,这就要求系统必须要能够控制:哪些访问者能够访问系统的信息,访问者访问的是“什么信息〞,访问者对他所访问的数据拥有什么样的“权限〞。可以用“who对what(which)是否能进行how的操作〞来表述应用系统权限的需求。这就涉及到网络平安的重要内容:权限管理与访问控制。访问控制是信息平安保障机制的核心内容,它是实现数据保密性和完整性机制的主要手段。访问控制是为了限制访问主体〔或称为发起者,是一个主动的实体:如用户、进程、效劳等〕,对访问客体〔需要保护的资源〕的访问权限,从而使计算机系统在合法范围内使用,访问控制机制决定用户及代表一定用户利益的程序能做什么,及做到什么程度。传统的应用系统通常是通过使用用户名+口令的方式来实现访问控制的。系统通过验证用户登录系统是输入的用户名和口令确定用户的身份,同时,系统通过维护一张访问控制列ACL表确定每个用户对特定系统对象,例如文件目录或数据库的操作权限,这种方法因为简便易行而得到了普遍的应用。但是对于一些大型组织机构来说,其应用系统较多,用户数量巨大,采用这种方式需要不同的应用系统分别针对保护的资源进行权限的管理和控制,因而产生了一些问题:1.权限管理混乱对一个组织机构而言,数据和人力资源都是统一的。但是由于系统设计的原因,可能同时对相同的人员采用不同的管理方式,对机构内的共享数据采用了不同的权限分配策略,这显然不合理,也不利于对机构资源的管理。2.系统平安性较低不同的权限管理策略产生的平安强度是不同的。这就可能造成机构信息平安管理的漏洞,因此入侵者就有可能瞄准那些权限管理相对不平安的系统进行集中攻击,这就给机构资源的平安性带来极大的危害。3.权限管理依赖于访问控制应用权限的赋予和撤销往往都是在访问控制应用中产生的,不同的访问控制应用之间尽管有相同的用户和授权策略却往往不能互相使用对方的权限。每个应用都要维护自己的用户信息和授权方法,权限无法在分布的应用中和远程应用中使用。4.资源所有者没有权限应用系统负责权限的发放和使用,造成权限真正的拥有者不能有效,及时地更改,发布实时的权限信息,比方机构内一个人职务或者业务的变化必须通知相关的不用应用中进行更新。而从本质上来讲,权限的发放和权限的鉴别使用是完全不同的两个过程,完全可以分开,权限的拥有者发放权限,而由资源的保护者验证权限。本系统的意义在于能够满足各类应用系统的权限管理需求,做到灵活、通用、方便。具体来说,就是可以对应用系统的所有资源进行权限控制,我们可以把这些资源简单概括为静态资源〔功能操作、数据列〕和动态资源〔数据〕,也分别称为对象资源和数据资源,后者是我们在系统设计与实现中的叫法。为了让权限操控界面友好且易用,要求对象资源和数据资源的进行树状组织。总之,系统的目标就是对应用系统的所有对象资源和数据资源进行权限控制,比方应用系统的功能菜单、各个界面的控件、数据显示的列以及各种动态数据进行权限的操控。2系统开发工具介绍2.1SQL简介SQL(StructuredQueryLanguage),意思为结构化查询语言,是一种介于关系代数与关系演算之间的结构化查询语言。它的主要功能就是同各种数据库建立联系,进行沟通。ANSI〔美国国家标准协会〕规定SQL是关系型数据库管理系统的标准语言。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据、从数据库中提取数据等。[1]
SQL语言之所以能够为用户和业界所接受,并成为国际标准,是因为它是一个综合的、功能极强同时又简捷易学的语言。SQL语言集数据查询、数据操纵、数据定义和数据控制功能于一体,主要特点包括:(1)综合统一非关系模型的数据语言一般都分为模式数据定义语言〔模式DDL〕、外模式数据定义语言〔外模式DDL〕、与数据存储有关的描述语言〔DSDL〕及数据操纵语言〔DML〕,分别用于定义模式、外模式、内模式和进行数据的存取与处置。当拥护数据库投入运行后,如果需要修改模式,必须停止现有的数据库的运行,转储数据,修改模式并编译后再重装数据库,十分麻烦。SQL语言那么集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动,包括定义关系模式、建立数据库、插入数据、查询、更新、维护、数据库重构、数据库平安性控制等一系列操作要求,这就为数据库应用系统的开发提供了良好的环境。用户在数据库系统投入运行后,还可根据需要随时地逐步地修改模式,切并不影响数据库的运行,从而使系统具有良好的可扩展性。(2)高度非过程化非关系数据模型的数据操纵语言是面向过程的语言,用其完成某项请求必须指定存取路径。而用SQL语言进行数据操作,只要提出“做什么〞,而无须指明“怎么做〞,因此无须了解存取路径,存取路径的选择以及SQL语言句的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。(3)面向集合的操作方式非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录。而SQL语言采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。(4)以同一种语法结构提供两种使用方式SQL语言既是自含式语言,又是嵌入式语言。作为自含式语言,他能够独立地用于联机交互的使用方式,用户何以在终端键盘上直接键入SQL命令对数据库进行操作;作为嵌入式语言,SQL语句能够嵌入到高级语言中,供程序员设计程序时使用。而在两种不同的使用方式下,SQL语言的语法结构根本上是一致的。(5)语言简捷,易学易用SQL语言功能极强,但由于设计巧妙,语言十分简捷,完成核心功能只用了9个动词,SQL语言接近英语口语,因此容易学习,容易使用。2.2JSP技术JSP(JavaServerPages)是由SunMicrosystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。用JSP开发的Web应用是跨平台的,即能在Linux下运行,也能在其他操作系统上运行。JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于效劳端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示别离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。Web效劳器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。JSP与JavaServlet一样,是在效劳器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。JSP的1.0标准的最后版本是1999年9月推出的,12月又推出了1.1标准。目前较新的是JSP1.2标准,JSP2.0标准的征求意见稿也已出台。JSP页面由HTML代码和嵌入其中的Java代码所组成。效劳器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。JavaServlet是JSP的技术根底,而且大型的Web应用程序的开发需要JavaServlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且平安可靠,主要面向因特网的所有特点。自JSP推出后,众多大公司都支持JSP技术的效劳器,如IBM、Oracle、Bea公司等,所以JSP迅速成为商业应用的效劳器端语言。2.3TomcatTomcat效劳器是一个免费的开放源代码的Web应用效劳器,目前最新版本是(截止到2009-0Tomcat是Apache软件基金会〔ApacheSoftwareFoundation〕的Jakarta工程中的一个核心工程,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP标准总是能在Tomcat中得到表达,Tomcat5支持最新的Servlet2.4和JSP2.0标准。因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了局部软件开发商的认可,成为目前比拟流行的Web应用效劳器。Tomcat很受广阔程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件效劳等开发应用系统常用的功能;而且它还在不断的改良和完善中,任何一个感兴趣的程序员都可以更改它或在其中参加新的功能。Tomcat是一个小型的轻量级应用效劳器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache效劳器,可利用它响应对HTML页面的访问请求。实际上Tomcat局部是Apache效劳器的扩展,但它是独立运行的,所以当你运行tomcat时,它实际上作为一个与Apache独立的进程单独运行的。3系统规划与系统分析3.1根本概念页面(URL):在web开发中也称为URL,最朴素的权限控制,就是基于页面的控制,即赋予访问者可以访问页面的范围,在系统记录所有的页面,配置权限时,将允许访问的页面,赋予使用者.虽然简单,却很直接和容易理解.基于这个思想,我们将软件的URL作为权限,进行控制.在海马权限系统中,将所有的URL进行记录.但如果直接将URL作为权限,配置给使用者,是相当麻烦的.因为,一个操作功能,往往不是在一个请求内完成的,这就意味着为了让使用者有权利完成一个功能,就必须将一组URL赋予使用者,以便其访问,显然这样给系统管理和维护带来了很多不方便.因此我们定义了下面的概念功能点.功能点:是一组不可分割URL,因为这组URL共同完成一个功能,因此他们是不可分开的.使用者要正常完成操作,就必须有权访问这组URL中的每一个.这样,我们将一个功能点赋予使用者,也就意味着这个使用者有访问这些URL的能力.在业务中,系统管理员不用关心到底什么权限对应哪些URL,只要将功能点赋予使用者,就可以关联URL了,完成授权过程.角色:角色又可以成为"岗位",它是一组功能点.很多时候,多个使用者的操作权限是相同的,例如一个部门中,大家都有观察自己邮箱的权利,都有修改自己口令和根本信息的权利,这时,就将邮箱功能点,修改口令,根本信息维护这几个功能点集合起来,建立一个角色--"操作员岗",那么,在给使用者授权时,只要将这个角色赋予使用者,该使用者就拥有了相应的功能操作权限.适合多使用者权限的管理,尤其是使用者数量众多,而且权限相同或者类似时,可以减少很多麻烦,减少出错概率.同时,在海马权限系统中,一个使用者可以同时拥有多个角色,这些角色所代表的权限,使用者可以同时拥有,是权限的并集.例如一个部门经理可以有"操作员"角色,具备根本的操作权限,同时还可以将"部门审核员"这个角色授予他,这样可以作操作局部管理功能.这样做,可以灵活的组合和配置使用者权限,适应复杂权限管理.用户:是软件系统使用者的系统账号.每个使用者,都有自己独一无二的账号,系统通过这个账号来识别不同的使用者.账号的平安是通过使用者口令加以保护的.口令在系统中是用加密的方式进行保存,防止了通过数据库系统泄漏使用者口令的问题.(同时可以限制相同账号在系统登陆,如果发生相同账号在不同地点同时系统登陆,那么将进行提示.)系统使用者是通过"用户"与"功能点"关联,完成使用者的授权,在使用者登陆系统后,也是通过"用户"来认证当前使用者的权限.单位:是和现实生活中的单位概念相似,在系统中将根据权限要求,将"用户"划分到不同的组织内.这种划分,有两层含义,从使用者的角度出发,将"用户"划分不同组织内,可以清楚的表示出现实的组织关系,方便使用者;从软件系统的角度,根据"用户"所在的不同组织,可以清楚的界定出相同类型的数据,在不同用户下的权限控制,也就是数据的权限控制.例如,天津的销售经理不能看到北京的销售部门的合同,这种相同类型的数据,权限控制往往是通过不同单位来控制的.更进一步,在现在的企业集团中,多个相对独立单位,同时使用系统,并且在单位之间还有一定的关系.海马权限系统中是通过"弱关联"来建立组织之间的这种复杂关系.并且可以在组织之间建立网状关系,即一个单位可以同时指定多个单位成为自己的上级单位,也可以不指定任何上级单位.这种网状关系,可以容易的表达复杂的组织之间的关系,同时也可以适应单一企业应用的简单要求.部门:是将单位中用户进一步分类方法.与现实中的部门相似.部门是为了在单位内进一步划分用户,同时有效控制用户的数据访问.但部门之间是有关系的.部门首先必须属于一个单位,不能独立于单位之外;其次,部门之间是有上下级关系的,有的部门是有自己的上级部门.从这里可以看出,一个单位中,这个单位和它的所有部门都组成了一个树状结构.规那么一:每个登陆的用户,可以有多个角色,规那么二:每个角色又可以访问多个功能点,规那么三:每个功能点又由多个页面组成。根据这个对应关系,就可以让每个用户对应到不同的页面,如果进行细致设置,根本上可以解决了应用中的很多情况。如下列图所示。具体的权限控制过程如下例所示:从上图,我们可以得到两个角色: 角色A:监控中心用户 角色B:车载终端用户从上图,我们也可以得到5个功能点: 功能点1:报警 功能点2:打车载 功能点3:查询车辆位置 功能点4:控制车辆 功能点5:调度信息每个功能点对应的页面很容易被确定。根据这些资料,就可以编写一个配置文件,将配置文件放在系统指定的目录下,权限体系就发生了改变。如果需要改变一个用户的权限,只需要在用户管理中,修改用户的角色。如果需要新增一个角色,那么需要重新编写配置文件,并将配置文件放在系统指定的目录下。在创立每个用户的时候我们要求每个用户属于某个单位以及这个单位的某个部门。在系统中的组织结构如下:单位是树型结构,可以没有上级单位,可以有下级单位,而且下级单位也可以有下级单位:每个单位内部又有树型结构的部门结构:而且,通用权限管理系统还应该为每个单位还提供了管理员〔系统管理员〕,他可以创立本单位不同于其它单位的组织结构,并为各个部门创立用户。这样我们的权限体系就完整了。我们的每个用户在登陆本系统后,就可以确定他的所属单位和部门,并且可以确定他可以使用的各个功能。3.3数据库需求分析由于权限管理采用了基于角色和操作的方式,因此数据库表中需要有用户表、角色表、操作表,结构如下图:在上图中添加了UserAction表,使用此表来添加特殊用户的权限,改表中有一个字段HasPermission可以决定用户是否有某种操作的权限,改表中记录的权限的优先级要高于UserRole中记录的用户权限。这样在应用程序中我们就需要通过UserRole和UserAction两张表中的记录判断权限。4系统设计与实现本系统的开发工作分为以下7个主要阶段:(1)系统需求分析与系统得功能设计。包括可行性分析,系统详细调查和用户需求分析,获取毕业设计选题过程的业务流程,收集各种用户对系统的要求,整理相关信息资料,确定系统的开发范围。(2)数据库设计。确定数据库结构,设计数据库的各种参数,创立实体数据库和数据库的标,视图和触发器等数据库对象。(3)程序模块划分和实现。根据系统所管理的信息的类型和功能对系统进行模块划分,分别编写代码,逐一实现系统功能。(4)平安策略设计。根据系统功能划分用户类型和权限,并进行平安模型的设计。(5)内部测试。完成系统主体功能后,进行系统内部测试,查找设计缺陷与错误,对缺陷和错误进行改良和纠正。(6)用户测试。包括根本功能测试、并发性测试和容错性测试。(7)工程实施与维护。在用户对系统认可并确认没有重大设计缺陷和错误的情况下,最终在全院各系进行系统实施,并进行维护。4.1系统设计4.1.1数据库设计通过以上数据项分析,可以得到本系统需要十张表,分别为:权限表、用户表、角色表、组表、用户权限关联表、用户角色关联表、角色权限关联表、组权限关联表、组角色关联表、用户属组关联表。各表及其关系如下:图权限类设计Permission权限类API
1.本类路径:
2.方法接口:
publicpermission()说明:类构造方法。
publicResultSetgetRs(Stringsql)throwsSQLException说明:查询数据库,获取记录集。入口参数为一个SQL语句,返回记录集。例子:ResultSetrs=permission.getRs("select*fromrigh");详细用法见。publicbooleannext()throwsSQLException说明:移动指针到下一个记录,用于操作封装在对象里的记录集。入口参数为空,根据操作成功与否返回一个布尔值。例子:permission.next();详细用法见。
publicStringgetString(Stringstr)throwsSQLException说明:从封装在对象里的记录集中取出字段记录。入口参数为字段名,返回字段的值。例子:permission.getString("字段名");详细用法见。
publicvoidclear()说明:清空内存变量。例子:permission.clear();详细用法见。
privatevoidclearResult()throwsSQLException说明:清空记录集,为私有方法,供内部调用。例子:clearResult();
publicvoidclose()throwsSQLException说明:关闭数据库、声明和连接。入口参数为空,返回空。例子:permission.close();详细用法见。
publicintencode(boolean[]permBool)说明:将布尔型权限类型数组转换为权限编码,入口参数为布尔型权限类型数组,返回权限编码。例子:permission.encode(permBool);详细用法见。
publicboolean[]decode(intrigh_code)说明:将权限编码转换为布尔型权限类型数组,入口参数为权限编码,返回布尔型权限类型数组。例子:permission.decode(-225);详细用法见。
publicboolean[]strToArr(StringpermStr)说明:将权限说明转换为布尔型权限类型数组,入口参数是权限说明,返回值为布尔型权限类型数组。例子:permission.strToArr("cp");详细用法见。
publicStringarrToStr(boolean[]permBool)说明:将布尔型权限类型数组转换为权限说明,入口参数为布尔型权限类型数组,返回权限说明。例子:permission.arrToStr(permBool);详细用法见。
publicintstrToCode(StringpermStr)说明:将权限说明转换为权限编码,入口参数是权限说明,返回权限编码。例子:permission.strToCode("ms");详细用法见。
publicStringcodeToStr(intrigh_code)说明:将权限编码解码为权限说明,入口参数为权限编码,返回值为权限说明。例子:permission.codeToStr(-129);详细用法见。
publicvoidgetPerm(intgid)throwsSQLException说明:根据组号从数据库中查出其全部权限,存入一个二维权限数组里,并封装在对象里。入口参数为组号,返回值为空。例子:permission.getPerm(1);详细用法见。
publicbooleanestPerm(intchan_cone_id,intchan_ctwo_id,StringpermStr)说明:根据一、二级栏目的编号,从封装的二位权限数组里查出其编码值,然后判断传入的权限说明是否符合条件。入口参数为一级栏目编号、二级栏目编号、权限说明,返回判断是否为真的布尔值。例子:permission.estPerm(1,2,"bi");详细用法见。3.程序流程:(01).查询数据库并取得记录集〔方法一〕(02).指针移动到下一个记录〔方法二〕(03).取字段值〔方法三〕(04).关闭数据库、声明和记录集〔方法四〕(05).编码功能,将01010101格式编成125〔方法五〕(06).解码功能,将格式125解成01010101〔方法六〕(07).将字符串分解存入权限数组〔方法七〕(08).将权限数组转换为字符串〔方法八〕(19).输入一个权限字符串,返回一个编码〔方法九〕(10).输入一个编码,返回一个权限字符串〔方法十〕(11).根据组ID查询取得当前用户的权限。存入一个二维数组〔方法十一〕(12).根据当前位置指针,及所需权限,从二维数组中判断权限是否为真〔方法十二〕
4.权限说明约定:
系统权限权限说明权限编码二进制权限类型数组浏览b12810000000permBool[0]添加i6401000000permBool[1]修改m3200100000permBool[2]屏蔽s1600010000permBool[3]删除d800001000permBool[4]审核a400000100permBool[5]作废c200000010permBool[6]打印p100000001permBool[7]
5.文件列表:Java源代码.htm本权限类组件源代码。
说明文档.htm本文件,类的详细说明、接口和思想。
/使用例如/存放怎样使用本类的jsp例子程序。
/使用例如演示怎样使用getRs()、next()、getString()、clear()、close()方法存取、移动指针、关闭数据库的例子。
/使用例如演示怎样使用encode()方法编码的例子。
/使用例如演示怎样使用decode()方法解码的例子。
/使用例如/str演示怎样使用strToArr()方法将权限说明转换为权限类型数组的例子。
/使用例如演示怎样使用arrToStr()方法将权限类型数组转换为权限说明的例子。
/使用例如演示怎样使用strToCode()方法将权限说明转换为权限编码的例子。
/使用例如演示怎样使用codeToStr()方法将权限编码转换为权限说明的例子。
/使用例如演示怎样使用getPerm()方法取出所有权限并访问其任意栏目权限的例子。
/使用例如演示怎样使用estPerm()方法判断其任意栏目是否具有权限的例子。
6.数据库表:
权限表〔righ〕:表中文名称字段名称数据类型数据宽度字段说明用户组IDgrou_idint20N权限IDrigh_idint25NAP一级栏目IDchan_cone_idtinyint2N二级栏目IDchan_ctwo_idtinyint2N权限编码righ_codeint8N
一级栏目表〔chan_cone〕:表中文名称字段名称数据类型数据宽度字段说明一级栏目代码chan_cone_idtinyint2NP一级栏目名称chan_cone_namevarchar15N
二级栏目表〔chan_ctwo〕:表q中文名称字段名称数据类型数据宽度字段说明一级栏目代码chan_cone_idtinyint2N二级栏目代码chan_ctwo_idtinyint2NP二级栏目名称chan_ctwo_namevarchar15N4.2系统实现由于本系统完善度较高,贴近现实使用,故代码量庞大,无法一一列举说明,以下仅列举特定功能进行说明。权限类实现////////////////////////////////////////////////////////////////////文件//描述:权限设置组件。//版本//////////////////////////////////////////////////////////////////
//定义组件权限包。packagecom.perm;
//导入标准Sql包。importjava.sql.*;importjavax.sql.*;
//导入Resin内置的Sql类,以便使用数据库连接池。importcom.caucho.sql.DBPool;
//=======================================//类名:permission//描述:权限设置类。
//=======================================publicclasspermission{/*循环类变量*///定义for循环变量i、j。privateinti,j;
/*数组类变量*///定义权限赋值数组。privatechar[]permChar;//定义权限类型数组。publicboolean[]permBool;publicboolean[]permBoolCompare;//定义权限数组,创立权限数组对象。publicint[][]permInt=newint[5][20];
/*权限说明类变量*///定义权限说明字符串。publicStringpermStr;
/*编码参数类变量*///定义编码参数。privateintcodePar;
/*信息类变量*///定义判断信息。privatebooleanestMess;
/*数据库字段类变量*///定义栏目一的序号。privateintchan_cone_id;//定义栏目二的序号。privateintchan_ctwo_id;//定义权限编码。privateintrigh_code;
/*JDBC连接类变量*///定义连接型变量conn以创立连接。privateConnectionconn;//定义JDBC声明。privateStatementstmt;//定义记录集型变量rs。privateResultSetrs;//定义sql语句。privateStringsql;
////方法名:permission//参数:无。//返回:无。//功能描述:构造方法,在创立对象时执行初始化工作。//创立:08/21/01//修改:08/25/01//
publicpermission(){/*数组类变量初始化*///创立权限类型数组对象。permBool=newboolean[8];permBoolCompare=newboolean[8];
/*权限说明类变量初始化*///给权限说明字符串赋值。permStr="";
/*信息类变量初始化*///给返回信息赋值。estMess=true;}
////方法名:getRs//参数:sql输入sql语句。//返回:空。//功能描述:通过Resin内置连接池访问数据库并取得记录集。//创立:08/21/01//修改:09/12/01//publicResultSetgetRs(Stringsql)throwsSQLException{try{//创立连接。conn=DBPool.getPool("Database").getConnection();//创立声明。stmt=conn.createStatement();//取得记录集。rs=stmt.executeQuery(sql);}catch(Exceptione){//抛出异常。System.err.println(e);}
//返回记录集。returnrs;}
////方法名:next//参数:空。//返回:空。//功能描述:指针移动到下一个记录。//创立:08/21/01//修改:09/12/01//publicbooleannext()throwsSQLException{try{//检测记录集是否为空。if(rs==null)thrownewSQLException("记录集为空.");}catch(Exceptione){//抛出异常。System.err.println(e);}
//移动指针并返回。returnrs.next();}
////方法名:getString//参数:str字段名。//返回:str记录中的值。//功能描述:从记录中取值。//创立:08/21/01//修改:09/12/01//publicStringgetString(Stringstr)throwsSQLException{//取值并返回。returnrs.getString(str);}
////方法名:clear//参数:空//返回:空//功能描述:去除所有变量//创立:09/12/01//修改:09/15/01//publicvoidclear(){try{//清空循环变量。i=0;j=0;
//清空数组。permChar=null;permBool=null;permBoolCompare=null;permInt=null;
//清空字符串变量。permStr=null;sql=null;
//清空布尔型变量。estMess=false;
//清空整型变量。codePar=0;chan_cone_id=0;chan_ctwo_id=0;righ_code=0;}catch(Exceptione){//抛出异常。System.err.println(e);}}
////方法名:clearResult//参数:空。//返回:空。//功能描述:去除记录集和声明。//创立:09/12/01//privatevoidclearResult()throwsSQLException{try{//关闭记录集。if(rs!=null)rs.close();//清空记录集变量。rs=null;
//关闭声明。if(stmt!=null)stmt.close();//清空声明变量。stmt=null;}catch(Exceptione){//抛出异常。System.err.println(e);}}
////方法名:close//参数:空。//返回:空。//功能描述:去除rs和stmt并关闭数据库//创立:08/21/01//修改:09/12/01//publicvoidclose()throwsSQLException{try{//清空记录集。clearResult();
//检查连接变量是否清空。if(conn==null)thrownewSQLException("当前连接为空.");
//预防反复关闭连接。if(conn.isClosed())thrownewSQLException("连接已经关闭.");
//执行关闭连接。conn.close();//清空连接变量。conn=null;}catch(Exceptione){//抛出异常。System.err.println(e);}}
////方法名:encode//参数:permBool布尔型权限类型数组。//返回:righ_code加密后的权限编码。//功能描述:将布尔型权限类型数组进行编码后加密,得到一个权限编码。//创立:08/21/01//修改:08/25/01//publicintencode(boolean[]permBool){try{righ_code=0;codePar=128;for(i=0;i<8;i++){//进行权限编码。righ_code=permBool[i]==true?righ_code|codePar:righ_code;//改变编码参数。codePar=codePar>>1;}}catch(Exceptione){//抛出异常。System.err.println(e);}//返回权限编码。returnrigh_code;}
////方法名:decode//参数:righ_code权限编码。//返回:permBool布尔型权限类型数组。//功能描述:将权限编码进行解密后解码,得到一个布尔型权限类型数组。//创立:08/21/01//修改:08/25/01//publicboolean[]decode(intrigh_code){try{codePar=128;
for(i=0;i<8;i++){//采用位运算的方法将解密后的权限编码解码。permBoolCompare[i]=((righ_code&codePar)==codePar)?true:false;//位移。codePar=codePar>>1;}}catch(Exceptione){//抛出异常。System.err.println(e);}//返回解码后的权限类型数组。returnpermBoolCompare;}
////方法名:strToArr//参数:permStr权限说明。//返回:permBool布尔型权限类型数组。//功能描述:把权限说明转换为布尔型权限类型数组。//创立:08/21/01//修改:08/25/01//publicboolean[]strToArr(StringpermStr){char[]permChar={'b','i','m','s','d','a','c','p'};
try{//将权限说明转换为权限类型数组,并记录信息。for(i=0;i<8;i++){permBool[i]=permStr.indexOf(permChar[i])!=-1?true:false;}}catch(Exceptione){//抛出异常。System.err.println(e);}//返回权限类型数组。returnpermBool;}
////方法名:arrToStr//参数:permBool布尔型权限类型数组。//返回:permStr权限说明。//功能描述:把布尔型权限类型数组转换为权限说明。//创立:08/21/01//修改:08/25/01//publicStringarrToStr(boolean[]permBool){char[]permChar={'b','i','m','s','d','a','c','p'};
try{//将权限说明转换为权限类型数组,并记录信息。for(i=0;i<8;i++){permStr=permBool[i]==true?permStr+permChar[i]:permStr;}}catch(Exceptione){//抛出异常。System.err.println(e);}//返回权限说明字符串。returnpermStr;}
////方法名:strToCode//参数:permStr权限说明字符串。//返回:righ_code加密后的权限编码。//功能描述:将权限说明字符串进行编码后加密,得到一个权限编码。//创立:08/21/01//修改:08/25/01//publicintstrToCode(StringpermStr){try{righ_code=encode(strToArr(permStr));}catch(Exceptione){//抛出异常。System.err.println(e);}//返回权限编码。returnrigh_code;}
////方法名:codeToStr//参数:righ_code权限编码。//返回:permStr权限说明字符串。//功能描述:将权限编码进行解密后解码,得到一个权限说明字符串。//创立:08/21/01//修改:08/25/01//publicStringcodeToStr(intrigh_code){try{permStr=arrToStr(decode(righ_code));}catch(Exceptione){//抛出异常。System.err.println(e);}//返回权限说明字符串。returnpermStr;}
////方法名:getPerm//参数:gid组ID号。//返回:空。//功能描述:根据组ID号访问数据库,取出其所有权限,并存到一个二维权限数组里。//创立:08/21/01//修改:08/25/01//publicvoidgetPerm(intgid)throwsSQLException{try{//编写sql语句。sql="selectchan_cone_id,chan_ctwo_id,righ_codefromrighwheregrou_id="+gid;//连接数据库,取得记录集。getRs(sql);while(rs.next()){//取出栏目一的值并转换为整型。chan_cone_id=java.lang.Integer.parseInt(rs.getString("chan_cone_id"));//取出栏目二的值并转换为整型。chan_ctwo_id=java.lang.Integer.parseInt(rs.getString("chan_ctwo_id"));//取出权限编码的值并转换为整型。righ_code=java.lang.Integer.parseInt(rs.getString("righ_code"));//根据栏目一和栏目二的值定义当前权限数组位置,写入权限编码。permInt[(chan_cone_id-1)][(chan_ctwo_id-1)]=righ_code;}//执行close()方法关闭数据库。close();}catch(Exceptione){//抛出异常。System.err.println(e);}}
////方法名:estPerm//参数:chan_cone_id,chan_ctwo_id,permStr子系统编号、栏目编号和权限说明。//返回:estMess布尔型判断信息。//功能描述:将权限编码righ_code和权限说明都转换为权限类型数组,将两者作比拟,并返回判断信息。//创立:08/21/01//修改:08/26/01//publicbooleanestPerm(intchan_cone_id,intchan_ctwo_id,StringpermStr){//boolean[]permBoolCompare=newboolean[8];
try{//将权限编码righ_code转换为权限类型数组。permBoolCompare=decode(permInt[chan_cone_id-1][chan_ctwo_id-1]);//将权限说明转换为权限类型数组。permBool=strToArr(permStr);//重置j作为计数器。j=0;//逐个比拟两者权限,如果两个权限类型数组为真并且相等,计数器加1。for(i=0;i<8;i++)j=(permBool[i]==permBoolCompare[i])&&(permBool[i]==true)?++j:j;//如果计数器的值和要求的权限说明个数相等,证明符合其要求。estMess=j==permStr.length()?true:false;}catch(Exceptione){//抛出异常。System.err.println(e);}//返回比拟结果。returnestMess;}}
4.2.2用户列表实现用户列表功能是用于测试通用权限的。列表界面如下:publicArrayList<UserForm>query(intcurPage){ setCurPage(curPage); StringBuildersql=newStringBuilder("SELECTuidFROMUsers"); ArrayList<UserForm>list=newArrayList<UserForm>(); Connectioncon=null; try{ con=ConnectionManager.getConnection(); Statementstmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSetrs=stmt.executeQuery(sql.toString()); //总页数 rs.last(); setTotalRow(rs.getRow()); //定位到第一条〔从0开始〕 intbeginIndex=(cur1)*getPerPage(); rs.absolute(beginIndex); //取这一页的数据 while(list.size()<this.getPerPage()&&rs.next()){ UserFormform=newUserForm(); form.setUid(rs.getString("uid")); list.add(form); } //释放内存 rs.close(); stmt.close(); }catch(SQLExceptione){ this.message=e.getMessage(); }finally{ try{ if(con!=null) con.close(); }catch(SQLExceptione){ } } returnlist;}4.2.3用户权限实现首先将所有权限显示在页面上,管理员针对某用户选择其权限。图为了显示所有权限,并同时显示用户已有的权限,编写函数实现,代码如下:CREATEFUNCTION[dbo].[GetUserQX]( @uidnvarchar(10))RETURNSTABLEASRETURN( FROMdbo.quanxian LEFTOUTERJOIN( select*fromdbo.userqxwhereuid=@uid )uqx)界面显示采用struts框架中的HTML标签实现:<html:formaction="/User"><html:hiddenproperty="UserAction"value="addqx"/><html:hiddenproperty="uid"/><div>用户:<bean:writename="userForm"property="uid"/></div> <tablecellspacing="0"cellpadding="0"> <logic:presentname="QXList"> <logic:iterateid="qx"name="QXList"> <tr> <tdheight="25"align="right"class="tdListFontSize"> <logic:equalname="qx"property="enabled"value="true"> <inputtype="checkbox"name="id"value="${pageScope.qx.id}"checked/> </logic:equal><logic:equalname="qx"property="enabled"value="false"> <inputtype="checkbox"name="id"value="${pageScope.qx.id}"/> </logic:equal> </td> <tdheight="25"align="left"class="tdListFontSize"> <bean:writename="qx"property="name"/> </td> </tr> </logic:iterate> </logic:present> </table> <html:submit>保存</html:submit></html:form>5系统测试由于条件限制,系统未能经过大规模访问及超大容量数据库测试,仅进行过小范围及叫嚣数据库测试。效劳器端:WindowsXPProSP2、Tomcat6、SQLSever2005开发版。客户端:IE8根本测试:用于测试系统根本功能的实现情况和系统是否存在设计错误。根本测试过程:使用管理员户进行登录,修改密码,修改系统功能,添加教师用户,修改学生、教师、选题等信息审核题目,查阅打印选题情况列表,增加新管理员,修改所有用户信息。注册学生用户,使用学生用户登录,修改个人信息及密码,查阅选题情况及教师信息,选报题目,退选题目。使用教师用户登录,修改个人信息及密码,提交题目,查看题目状态及选报学生信息。目标是分别使用不同用户登录,进行按规定程序操作,尝试各个功能,检测功能实现情况,检测页面生成情况及数据库连接情况。并发性测试:用于测试系统在多用户同时访问情况下对冲突的处理情况。并发性测试过程:同时使用多个用户登录,包括管理员、教师、及多个学生用户,使用软件同时提交表单,尝试不同学生同时选报同一题目,不同教师同时对同一题目进行操作,不同管理员同时对同一用户进行资料修改等。进行按规定程序操作,尝试各个功能,检测系统对并发性事件的处理能力。容错性测试:用户测试系统对错误信息的处理情况及对非法请求的控制情况。容错性测试过程:在同一台计算机上登录不同权限用户访问同一页面,直接输入url请求非法页面,检测显示情况。使用不同用户登录,尝试各种不正常操作,尝试进行越权操作,检测系统对非法操作的控制能力。5.3测试结果根本测试,用户功能全部实现,完全满足用户要求。并发性测试,多用户同时登录时未出现不正常状态,效劳器对不同用户请求进行分布处理。容错性测试,系统对非法请求进行限制,对非法操作进行正确提示,限制非法用户访问页面。6软件开发中主要解决的问题在本系统的构思过程中,我主要考虑了2个问题,一是平安方面的,另一个是软件工程方面的。数据库的平安性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。系统平安保护措施是否有效是数据库系统的主要指标之一。它的平安是很重要的。数据库数据量庞大、用户访问频繁,有些数据具有保密性,因此数据库要由数据库管理系统进行科学的组织和管理,以确保数据库的平安性和完整性。[7]对于数据库管理来说,保护数据不受内部和外部侵害是一项重要的工作。MicrosoftSQLServer正日益广泛的使用于各部门内外,作为SQLServer的数据库系统管理员,需要深入的理解SQLServer的平安性控制策略,以实现管理平安性的目标。各层SQLServer平安控制策略是通过各层平安控制系统的身份验证实现的。身份验证是指当用户访问系统时,系统对该用户的账号和口令确实认过程。身份验证的内容包括确认用户的账号是否有效、能否访问系统、能访问系统的哪些数据等。访问系统用户能否访问SQLServer系统就取决于SQLServer系统身份验证方式的设置。下面介绍用户标识与验证:用户标示和验证是系统提供的最外层平安保护措施。其方法是由系统提供一定的方式让用户标示自己的名字或身份。每次用户要求进入系统时,由系统进行核对,通过鉴定后才提供机器使用权。对于获得上机权的用户假设要使用数据库时数据库管理系统还要进行用户标识和鉴定。用户标识和鉴定的方法有很多种,而且在一个系统中往往是多种方法并举,以获得更强的平安性。常用的方法有:用一个用户名或者用户标识号来标明用户身份。系统内部记录着所有合法用户的标识,系统验证此户是否合法用户,假设是,那么可以进入下一步的核实;假设不是,那么不能使用系统。为了进一步核实用户,系统常常要求用户输入口令〔Password〕。为保密起见,用户在终端上输入的口令不显示在屏幕上。系统核对口令以验证用户身份。用户标识与验证在SQLServer中对应的是WindowsNT/2000登录账号和口令以及SQLServ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陕西中医药大学《藏医药经典著作选读》2023-2024学年第一学期期末试卷
- 陕西国际商贸学院《中国财政史》2023-2024学年第二学期期末试卷
- 陕西学前师范学院《食品微生物》2023-2024学年第二学期期末试卷
- 陕西师范大学《固体矿产勘查案例》2023-2024学年第二学期期末试卷
- 陕西服装工程学院《彝文典籍导读》2023-2024学年第二学期期末试卷
- 陕西省咸阳市礼泉县2025届高三下学期第五次月考语文试题试卷含解析
- 陕西省延安一中2024-2025学年高三二模数学试题试卷与答案含解析
- 陕西省榆林市佳县2025届六年级下学期5月模拟预测数学试题含解析
- 陕西省汉中市南郑中学2025届高三第五次适应性训练生物试题试卷含解析
- 陕西省渭南市2024-2025学年小升初复习数学模拟试卷含解析
- JGJ31-2003 体育建筑设计规范
- 自然灾害综合监测预警站点建设指南
- DL-T5366-2014发电厂汽水管道应力计算技术规程
- 张伟《精彩纷呈的太空科学实验》课件
- DZ∕T 0382-2021 固体矿产勘查地质填图规范(正式版)
- 国开2024年《机械设计基础》形考任务1-4答案
- 某局副局长日常廉政谈话记录
- 2023年福建省考评员考试题
- 《公路桥梁抗震设计细则》-鲍卫刚
- 保洁员安全培训教育课件
- 赵一曼英雄事迹
评论
0/150
提交评论