基于MVC架构的网站RBAC访问控制框架设计与实现-计算机科学与技术毕业设计论文_第1页
基于MVC架构的网站RBAC访问控制框架设计与实现-计算机科学与技术毕业设计论文_第2页
基于MVC架构的网站RBAC访问控制框架设计与实现-计算机科学与技术毕业设计论文_第3页
基于MVC架构的网站RBAC访问控制框架设计与实现-计算机科学与技术毕业设计论文_第4页
基于MVC架构的网站RBAC访问控制框架设计与实现-计算机科学与技术毕业设计论文_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE47基于MVC架构的网站RBAC访问控制框架设计与实现xx科技学院毕业设计论文姓名:xxx专业:计算机科学与技术指导老师:xxx

摘要一个实际的商务网站系统除了需要关注于功能需求之外,还需要考虑很多非功能性需求,安全性就是其中一个非常重要的方面。访问控制是几乎所有的应用系统都不可缺少的一部分。本文从MVC架构商务管理系统的需求出发,首先分析了几种访问控制的优缺点,在此基础上提出了利用RBAC模型来进行系统的访问控制。并将其用于某一具体的商务系统中,给出了实现过程。关键词:MVC、RBAC、访问控制、角色、权限。AbstractWhenfunctionalrequirementsarechieflypaidattentiontobypeopleinacommercialapplicationsystem,manynonfunctionalrequirementsarealsotakenintoaccount.Securityisoneofthemostimportantaspectsofthenonfunctionalrequirements.Accesscontrolalmostisanecessarypartinallapplicationsystems.ThispaperanalysestherequirementsofcomprehensivecommercialinformationmanagementsystembasedonMVC.Itanalysesthemeritsanddemeritsamongthecommonaccesscontrols,andproposesprocessaccesscontrolbasedonRBACmodel.Finally,itdescribeshowtorealizethemodelinamaterialcommercialsystem.Keywords:MVC,RBAC,AccessControl,Role,Permission.

目录引言 1第一章课题背景 21.1MVC概述 21.2RBAC模型概述 31.2.1RBAC原理简介 31.2.2RBAC适用性分析 51.3RBAC在MVC中的应用现状 6第二章系统框架分析与设计 92.1基于MVC架构的Web系统 92.2RBAC模型的建立 112.3RBAC模型在MVC网站中的应用 12第三章设计实现 143.1RBAC框架实现 143.2RBAC模型在系统中的实现 173.2.1系统功能模块的实现 173.2.2系统权限模块的实现 213.2.3系统角色模块的实现 233.2.4为用户设置角色 253.2.5用户权限功能树的生成 26第四章系统测试 294.1系统测试 294.1.1测试环境 294.1.2测试方案 294.2总结与展望 324.3致谢 33参考文献 34附录A:英文原文 35附录B:中文翻译 41引言本此毕业设计将基于角色访问控制(Role-BasedAccessControl,RBAC)作为研究课题,来实现一个企业内部管理系统中的权限管理部分。本文在RBAC2001建议标准的参考模型(下称NISTRBAC模型)的基础上,结合综合信息管理系统以及软件系统集成的要求和特点,将RBAC访问控制框架应用到一个已有的以MVC为架构建立而成的商务网站中去。

第一章课题背景1.1MVC概述 由于Internet的普及和网络技术的发展,大部分的企业或单位都拥有了自己的Web站点。通过Internet或Intranet,企业的管理变得更加方便;企业的信息发布变得更加便捷;企业的市场开拓变得更加简便。企业网站大部分属于商务网站,企业通过利用Web系统,可以方便的发布产品信息,管理订单信息,管理内部的诸如人事、员工薪酬信息等。从而在一定程度上提高工作和管理效率,降低生产和管理成本。现在用来建立Web站点的工具和编程语言主要有ASP、PHP和JSP,使用的设计模式是MVC。MVC作为构建网站系统的主流设计模式,有其自身的特点和优势,具体表现在:(1)可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。(2)视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。(3)模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。(4)潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。基于MVC模式建设Web站点系统,可以提高代码的重用性;可以提高代码的可维护性;可以提高编写程序的效率。所以目前,越来越多的网站开始采用MVC模式来进行架构,但是在这其中,对于系统安全性问题的研究还进行的不多。在构建Web系统之初,就要考虑系统的安全性,考虑用户对系统的访问控制。通过访问控制,一方面只有合法的用户才可以安全、正确的使用系统,非法的用户是无法登陆系统进行操作;的;另一方面合法的用户登录系统之后,由于用户的类型不同,就会存在不用的用户在访问系统时具有不同的权限,比如一个企业或公司的经理往往会比企业或公司的员工具有更多的权限和功能,相应的用户登录系统之后,他们只能行使系统准许他们的权限。纵观现在的Web系统,大都存在这样的问题:功能虽强大,但是却存在很多的安全隐患。系统中的不同类型的用户对信息都具有相同的权限,可以任意的修改和删除,这对于一些重要的信息是非常危险的。对信息的科学管理,应该是最高层的用户拥有对信息最高的权限,而处于底层或次底层的用户仅拥有对信息最少的权限。此外,现在大部分Web系统中都缺少一个良好的访问控制模块。在该模块中,可以为系统设定不同的用户,分配不同的权限。将系统中的用户和系统中的权限关联起来,形成一种有效的系统安全管理。综上所述,企业在构建自身的商务Web系统时,在考虑功能完整性和操作简便性的同时,还应重点考虑构建的Web系统的安全性。只有在保证了安全性的前提下,功能的完整性和操作的简便性才变得有意义。 1.2RBAC模型概述 1.2.1RBAC原理简介1992年,美国国家标准与技术研究所(NIST)的DavidFerraiolo和RickKuhn在综合了大量的实际研究之后,率先提出基于角色的访问控制模型框架,并给出了RBAC模型的一种形式化定义。该模型第一次引入了角色的概念并给出其基本语义,指出RBAC模型实现了最小权限原则(theleastprivilege)和职责分离原则(separationofduty)。该模型中给出了一种集中式管理的RBAC管理方案。1995年他们以一种更直观的方式对该模型进行了描述。RaviSandhu和他领导的位于GeorgeMason大学的信息安全技术实验室(LIST)于1996年提出了著名的RBAC96模型,将传统的RBAC模型根据不同需要拆分成四种嵌套的模型并给出形式化定义,极大的提高了系统灵活性和可用性。1997年他们更进一步,提出了一种分布式RBAC管理模型DRBAC97,实现了在RBAC模型基础上的分布式管理。这两个模型清晰的表征了RBAC概念并且蕴涵了他人的工作,成为RBAC的经典模型。绝大多数基于角色的访问控制研究都以这两个模型作为出发点。在RBAC中,涉及到的基本概念如下:用户(User):系统的使用者。可以是人、计算机、机器人等,一般指人。角色(Role):一定数量的权限的集合。权限分配的单位与载体,目的是隔离用户与权限的逻辑关系。对应于组织中某一特定的职能岗位,代表特定的任务范畴。角色的例子有:经理、采购员、推销员等。权限(Permission):表示对系统中的客体进行特定模式访问的操作许可,例如对数据库系统中关系表的选择、插入、删除。在应用中,许可受到特定应用逻辑的限制。用户指派(UserAssignment):用户与角色之间的关系是多对多的关系。用户指派指根据用户在组织中的职责和能力被赋为对应角色的成员。用户通过被指派到角色间接获得访问资源的权限。权限指派(PermissionAssignment):角色与权限之间的关系也是多对多的关系。权限指派指角色按其职责范围与一组操作权限相关联。进行权限分配时,应遵循最小特权原则(theLeastPrivilegeRule),即分配的权限集既能保证角色充分行使其职权,又不能超越职权范围。角色激活(RoleActivation):是指用户从被授权的角色中选择一组角色的过程。用户访问的时候实际具有的角色只包含激活后的角色,未激活的角色在访问中不起作用。相对于静态的角色授权来说,角色激活是一种动态的过程,提供了相当的灵活性。会话(Session):用户是一个静态的概念,会话则是一个动态的概念。一次会话是用户的一个活跃进程,它代表用户与系统进行交互,也叫主体(Subject)。用户与会话是一对多关系,一个用户可同时打开多个会话。活跃角色集(ARS):一个对话构成一个用户到多个角色的映射,即会话激活了用户授权角色集的某个子集,这个子集被称为活动角色集,ARS决定了本次会话的许可集。在RBAC中,它遵循如下的基本原则:角色继承(RoleInheritance)为了提高效率,避免相同权限的重复设置,RBAC采用了“角色继承”的概念,定义了这样的一些角色,他们有自己的属性,但可能还继承其他角色的属性和权限。角色继承把角色组织起来,能够很自然地反映组织内部人员之间的职权、责任关系。最小权限原则(theLeastPrivilegeRule)所谓最小权限原则是指:用户所拥有的权力不能超过他执行工作时所需的权限。实现最小权限原则,需分清用户的工作内容,确定执行该项工作的最小权限集,然后将用户限制在这些权限范围之内。在RBAC中,可以根据组织内的规章制度、职员的分工等设计拥有不同权限的角色,只有角色需要执行的操作才授权给角色。当一个主体预访问某资源时,如果该操作不在主体当前活跃角色的授权操作之内,该访问将被拒绝。职责分离(SeparationofDuty)对于某些特定的操作集,某一个角色或用户不可能同时独立地完成所有这些操作。职责分离的概念包括:多路共享资源,用功能分解命名互相区分的权限集,对用户进行强制分类,允许层次性的分解权限。1.2.2RBAC适用性分析在RBAC模型中,一个用户通过用户授权获得一个或者几个角色,但角色不能被同时激活;一个角色可以被同时授予多个用户;每个角色有一个或多个节点,一个节点也可以被赋予多个角色;每个节点有一个或者多个功能,一个功能可以被同时挂在不同的节点上,而节点可以有子节点,子节点也可以再有子节点;一个功能对应一个或多个页面;一个页面有一个或多个操作。这样每个用户登录时就可以根据角色得到一棵功能树从而使用系统中的资源。为更真实的描述现实,RBAC模型还有许多的控制机制。如对Web页面多维度和细粒度控制,对角色、功能、节点的静态限制和对角色的动态限制。对页面的限制主要是限制用户在特定时间和特定地点所能看到的功能和所能进行的操作。其他限制主要是在功能被赋予节点时、节点被赋予角色时和角色被赋予用户时的限制。模型中有了这些限制才更完整、更真实地反应现实,从而使实际模型细化的过程更加平滑,现实和计算机实现策略达到较好的融合。页面是Web应用系统中最重要的元素,控制页面访问是整个系统安全的重要条件。对页面的访问控制可以从时间和空间两个方面来进行,对页面功能和数据的访问,可以通过用户登录后所带session中的信息进行控制。时间约束分为一般时间约束和周期时间约束两种。一般时间约束是指从一个时间点持续到另一时间点之间可以访问某个页面,例如,企业商务系统中的商品招标页面,它在某一指定时间段内开放,对这种约束可以在用户访问网页的时候判断访问时间是否在允许范围内。周期时间约束是指对那些功能和数据周期性开放的页面进行访问控制。空间约束主要是对用户在不同地方(网段)登录所能看到的页面以及页面能提供的信息进行控制。例如,管理部门内部事务所对应的页面通常对用户所在的访问位置有较严的限制。一般系统的高层用户都有一个固定的IP段,就可以对那些重要的页面设置允许访问的IP范围来达到对关键资源的保护。对页面的空间约束可以分成分网段、分楼层、分房间、分IP地址等不同层次的控制。对页面功能和数据的访问需要知道用户的大概类型,主要包括管理员、部门管理员、一般职工、游客(企业或单位以外的人员)等。用户登录后将用户的类型保存到session中,在用户访问页面时就可以根据用户的不同类型,以及他们对时间、空间等硬性约束的满足情况来显示相应的功能和数据。通过了解RBAC模型的原理和RBAC模型中对访问控制的支持,我们可以看出,RBAC模型可以很好的应用于已有或将要开发的企业商务Web系统中。通过在系统中使用RBAC模型,可以很好的解决如下的问题:权限管理混乱的问题。通过在系统中增加角色这个概念,很好的解决了这个问题。在RBAC模型中,可以利用角色与系统中的所有权限关联,使得某种角色具有某种特定的权限,从而在为用户设定好相应的角色之后,也就意味着得到了相应的系统权限。控制逻辑混乱的问题。通过使用RBAC模型,可以避免在系统中书写负责的控制逻辑来进行访问控制。尤其当系统设计的用户和角色比较多时,单纯的依靠代码进行访问控制将变得相当困难。换句话说,RBAC模型为我们提供了良好的访问控制支持。在企业商务Web系统中利用RBAC模型,可以简便、科学、清晰地进行访问控制,从而在一定程度上提高了整个Web系统的安全性。1.3RBAC在MVC中的应用现状 网站程序的安全是系统开发人员必须考虑的重要因素之一,因为这涉及到网站的建设者、网站用户的诸多安全问题,如果不处理好,可能会给系统的使用者和管理者带来严重问题。现在普遍在使用的安全措施有如下几种:(1)防止SQL注入比如URL、表单等提交信息时,通过一段防止SQL注入的过滤代码即可防止出错信息暴露,或者通过转向,当系统出错时转到一个提示出错的页面等。对于文本型输入,如果要进行检查,就得根据字段本身的性质进行。例如如果是年龄,就得限定必须是数字,大小必须限定在一个范围之间,比如说18-120之间。对于用户名,应该建立一个集合,这个集合里存放有被允许的字符,或被禁止的字符。(2)验证码技术所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素,由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。放在会员注册、留言本等所有客户端提交信息的页面,要提交信息,必须要输入正确的验证码,从而可以防止不法用户用软件频繁注册,频繁发送不良信息等。(3)MD5加密技术MD5的全称是Message-DigestAlgorithm5,当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。(4)数据备份一般采用数据库系统自动定时备份、定时自动删除几天以前的数据等,即可完成数据的备份功能。而图片、文件一般是不能自动备份,需要手工操作,所以我们必须要定期手工对网站的图片、文件进行备份操作。访问控制技术是由美国国防部(DepartmentofDefense,DoD)资助的研究和开发成果演变而来的。这一研究导致两种基本类型访问控制的产生:自主访问控制(DiscretionaryAccessControl,DAC)和强制访问控制(MandatoryAccessControl,MAC)。最初的研究和应用主要是为了防止机密信息被未经授权者访问,近期的应用主要是把这些策略应用到为商业领域。自主访问控制,允许把访问控制权的授予和取消留给个体用户来判断。为没有访问控制权的个体用户授予和废除许可。自主访问控制机制允许用户被授权和取消访问其控制之下的任何客体(object),换句话说,用户就是他们控制下的客体的拥有者。然而,对于多数组织来说,最终用户对所访问的信息没有拥有权。对于这些组织,公司或代理机构是事实上的系统客体和处理他们的程序的拥有者。访问优先权受组织控制,而且也常常基于雇员功能而不是数据所有权。强制访问控制,在美国国防部TrustedComputerSecurityEvaluationCriteria(TCSEC)中定义如下:“一种限制访问客体的手段,它以包含在这些客体中的信息敏感性和访问这些敏感性信息的主体的正式授权信息(如清除)为基础”。强制访问控制是“强加”给访问主体的,即系统强制主体服从访问控制政策。强制访问控制(MAC)的主要特征是对所有主体及其所控制的客体(例如:进程、文件、段、设备)实施强制访问控制。为这些主体及客体指定敏感标记,这些标记是等级分类和非等级类别的组合,它们是实施强制访问控制的依据。系统通过比较主体和客体的敏感标记来决定一个主体是否能够访问某个客体。用户的程序不能改变他自己及任何其它客体的敏感标记,从而系统可以防止特洛伊木马的攻击。强制访问控制一般与自主访问控制结合使用,并且实施一些附加的、更强的访问限制。一个主体只有通过了自主与强制性访问限制检查后,才能访问某个客体。用户可以利用自主访问控制来防范其它用户对自己客体的攻击,由于用户不能直接改变强制访问控制属性,所以强制访问控制提供了一个不可逾越的、更强的安全保护层以防止其它用户偶然或故意地滥用自主访问控制。以上访问控制策略对于处理一些无需保密但又敏感的信息的政府和行业组织的需求并不是特别的适合。在这样的环境下,安全目标支持产生于现有法律、道德规范、规章、或一般惯例的高端组织策略。这些环境通常需要控制个体行为的能力,而不仅仅是如何根据信息的敏感性为其设置标签从而访问这一信息的个人能力。就基于角色访问控制而言,访问决策是基于角色的,个体用户是某个组织的一部分。用户具有指派的角色(比如医生、护士、出纳、经理)。定义角色的过程应该基于对组织运转的彻底分析,应该包括来自一个组织中更广范围用户的输入。访问权按角色名分组,资源的使用受限于授权给假定关联角色的个体。例如,在一个商务管理系统中,经理角色可能包括人事管理、工资管理、分配项目等;而一般员工的角色则被限制为仅能浏览自己的一些信息,如基本信息、工资信息和工程项目信息等。基于角色的访问控制模型RBAC比传统的自主访问控制和强制访问控制更优越,同时也提供了更高的灵活性和扩展性。RBAC访问控制模型实现了用户与访问权限的逻辑分离,减少了授权管理的复杂性,降低了管理开销和管理的复杂度。对于现在规模日益增大的基于MVC架构的商务信息管理系统来说,采用RBAC访问控制模型的访问控制模块将会起到越来越大的作用。综上分析,控制访问角色的运用是一种开发和加强企业特殊安全策略,进行安全管理过程流程化的有效手段。运用RBAC模型可以很好的解决Web系统中提出的访问控制要求,而DAC、MAC等等访问控制技术由于各种各样的局限性和特性,都不是WEB系统下实现访问控制的最好选择。从目前的应用现状来看,以MVC为架构而建成的WEB网站特别是商务网站的数量较为庞大,而由于其自身的管理特性,对安全措施的要求也越来越高,这就要求我们找到一种更为有效的权限管理方法去适应网站对访问控制技术的要求。而RBAC作为一种科学、合理、灵活、成熟的访问控制技术,最适合于在WEB环境下使用,所以如何使它应用到那些基于MVC架构的网站中去,会是一个具有相当研究价值的课题。

第二章系统框架分析与设计 2.1基于MVC架构的Web系统在当前开发的商务系统中,一般都会包括部门管理功能模块,员工管理功能模块,工程项目管理功能模块和员工薪水管理功能模块,以及包括针对员工使用的信息查看模块。先下面给出一个已经设计完善的基于MVC架构的WEB网站,系统的功能模块图如图2-1所示。系统的功能模块系统的功能模块部门管理模块员工管理模块工程项目管理模块员工工资管理模块信息查看模块系统功能管理模块系统用户管理模块系统角色管理模块图2-1系统功能模块图部门管理模块:针对公司内部的所有的部门进行管理,用户可以方便地添加部门、修改部门信息、删除某一部门和查询某一部门的信息。员工管理模块:针对公司内部的所有的员工进行管理,用户可以方便地添加员工信息、修改员工信息、删除某一员工信息和查询某一部门的所有员工信息。工程项目管理模块:针对公司的工程项目进行管理,用户可以方便地添加工程项目信息、修改某一工程项目的信息、删除某工程项目的信息和查询某一工程项目信息。员工工资管理模块:针对公司内部的所有的员工的薪酬进行管理,用户可以方便地添加工资信息、修改工资信息、删除工资信息和查询某一员工在某段时间内的所有工资信息。信息查看模块:针对公司员工设计的功能模块,通过该模块员工可以方便的查看自己的基本信息,工资信息以及所负责的工程项目信息。系统功能管理模块:用户可以通过该模块管理系统中涉及到的所有功能,可以添加、删除和修改。系统用户管理模块:用户可以通过该模块管理系统中涉及到的所有用户,可以添加、删除和修改。系统角色管理模块:用户可以通过该模块为系统中的不同的用户设置不同的权限,并能够修改某一用户所赋予的权限。在上述的商务系统中,在安全性上一般会有如下的要求:能够很好的实现访问控制。在一个企业中,存在着很多种不同的用户,如经理、董事长、一般职工,系统维护人员等。当所有的用户面对同一个系统时,就应该做到用户之间要有区分,即进入系统后不同的用户只能实行自身拥有的权限,不可以越权。部分信息的保密。公司中存在着一些决定企业利益的信息,这些信息只能由公司的管理人员来查看和管理,任何非法的侵入都有可能造成不良的后果。现代主流的Web系统的体系架构设计基于J2EE平台上的MVC设计模式,应用Struts框架,采用B/S模式,具体的架构设计如图2-2所示。Oracle9iBrowserActionActionOracle9iBrowserActionActionActionHTMLJSPsStrutsTags(JSTL)StyleSheetActionServletRequestProcessorWebContainerControllerModelPresentationLayerHttpResponseHttpRequestBusinessManagement_MessagerRpertiesStruts-config.xmlViewJavaBeanBusinessObjectsDatabaseLayerWeb.xmlBusinessLayerClientLayer图2-2商务管理系统架构图在图2-2中,系统架构可以细分为以下4个层次:客户层(ClientLayer):运行在用户机器的浏览器中,处理与用户的交互。表现层(PresentationLayer):运行在J2EEWeb容器中,产生系统的表现逻辑,处理用户的请求并做出响应;整个Web层建立在Struts框架基础上,其中View由HTML和JSP页面组成,其数据表示是ActionFormBean;Controller由ActionServlet组合Struts-config.xml和Action类组成;而Model则交由业务逻辑层来实现。业务逻辑层(BusinessLayer):运行在J2EEWeb容器中,完成系统的业务需求,为Web层提供所需的业务方法,由JavaBean构成系统的BusinessObjects(BO),并使用DAO模式把数据访问封装起来,以供在其他应用层中统一调用。数据源层(DatabaseLayer):即数据库层,存放系统的应用数据,系统采用Oracle9i作为数据库服务器。系统的架构可以表示为JSP+Struts+Database。使用这种架构一方面便于系统的开发和管理;另一方面,层与层之间的开发几乎是完全独立的,从而降低了数据在各层之间的耦合性,提高了系统的可维护性和可扩展性。此外,系统是由Java来开发实现的,Java的跨平台特性实现了系统的可移植性。2.2RBAC模型的建立 根据上述商务系统对安全性的需求,通过在Web系统中使用RBAC模型可以很好的满足各项需求。RBAC的核心思想就是:根据用户需求,给用户分派各种角色,为不同的角色分配各种权限,用户通过自己所属的角色获得操作权限许可。其核心模型如图2-3所示。 图2-3RBAC模型核心RBAC模型的组成部分是:Users:用户集{u1,u2,u3……,un};Roles:角色集{r1,r2,r3,……,rn};OPS:操作集{op1,op2,op3,……,opn}OBJ:客体集{obj1,obj2,obj3,……,objn}P=OPSX0BJ:权限集是不同客体上不同操作的描述{pl,p2,p3,.⋯,pn}:用户—角色分配关系:多对多;Assigned-users:,角色与用户的映射,将一个角色与一组用户相映射;:权限-角色分配关系,多对多;Assignedprivileges:,角色与权限的映射,将一个角色与一组权限相映射;Session:会话集{s1,s2,s3,……,sn}User_sessions:,用户与会话的映射,将一个用户与一个会话相映射;Session_roles:,会话与角色的映射,将一个会话与一组角色相映射;Avail_session_privilege:,在一次会话中一个用户允许的权限;用户:不仅指人,也可以指机器,网络或智能代理。角色:管理员依据安全策略划分出来的操作集合,表示该角色成员所授予的职权和责任。客体:指系统需要保护的资源。权限:对系统中的客体进行特定存取的许可。权限是与客体紧密相关的,不同的系统,其权限规定是不同的,既可以指网络的应用,如对某个子网的访问权限,也可以指对数据库的表单等的访问。权限的粒度大小取决于实际系统的定义。会话:为了对系统资源进行操作,用户需要建立会话,每个会话将一个用户与他所对应的角色集中的一部分建立映射关系,这一角色子集成为被会话激活的角色,在这次会话中,用户可以执行的操作就是该会话激活的角色对应的权限所允许的操作。上述RBAC模型是RBAC核心模型,此模型保留了RBAC的最小特征集,是每个RBAC系统都需要的元素。2.3RBAC模型在MVC网站中的应用由需求分析可知,需要为企业内部网管理系统设计一个用户权限管理的功能模块,从而达到对用户权限进行管理的目的。当今的大型的信息管理系统都具有功能复杂,用户众多的特点,如果仍采用传统的权限管理方式,直接将权限分配给用户,对具有相同权限的一类用户同样的授权操作将被重复很多遍,一旦用户工作岗位有变化,则对其权限的调整将非常复杂,而基于RBAC模型的权限控制方法则大大简化了这种授权管理的复杂度,降低了系统管理的开销。RBAC模型描述了一种良好的访问控制方法和原理。通过在商务Web系统中使用RBAC模型可以方便、科学、合理地进行访问控制,有了良好的访问控制,不同的用户在使用系统的时候仅能访问自身被赋予的权限,用户之间不能越权访问,从而保证了信息的安全性和一致性,从而提高了系统的安全性。通过以下几个步骤,可以将RBAC模型应用在MVC网站中。(1)建立功能的概念。功能,即操作。在系统中,如对员工的添加、删除和修改的操作,都可以描述为一个功能。(2)建立权限节点的概念。权限节点,顾名思义,它对应着一个或一组功能操作菜单,表示了该节点可以进行系统操作的范围。(3)建立角色的概念。将角色与节点对应起来,一个角色可以对应多个节点,一个节点也可以对应多个角色,这是一个多对多的关系。角色与节点对应好之后,也就意味着角色与某一个或某一组功能操作菜单建立了关联。系统中存在不同类型的用户,也即不同的用户隶属于不同的角色。(4)将系统的用户和角色关联起来。一旦一个用户被设置了某个角色,那么也就意味着该用户具有了某些权限。具有了某些权限,也就意味着拥有了某些功能(对系统的操作和管理)。举例来说,假设系统中存在两个权限节点1和2,两个角色A和B,用户有甲(经理)和乙(部门经理),很显然甲和乙在登陆系统后应该具有不同的权限,甲可以管理整个公司的信息,而乙仅能管理所在部门的信息。这时,设定权限节点1下包含了管理整个公司信息的所有功能,权限节点2下包含了管理某个部门信息的所有功能;将角色A与节点1进行关联,将角色B与节点2进行关联。最后,将用户甲的角色设定为角色A,用户乙的角色设定为角色B。在用户甲和乙登陆系统后,就会看到自己所具有的功能菜单,其他用户的功能菜单是非可见的,从而实现了访问控制。简言之,通过在系统中设置功能、权限和角色的概念,就可以在系统中实现RBAC模型,并让它很好地为Web系统提供访问控制功能。

第三章设计实现 3.1RBAC框架实现 数据存储是个非常重要的功能需求。系统中很多的地方都要存储数据,并且其格式要求也不相同,数据量也差别较大。良好的设计不但能减少因数据保存不当造成的对系统的损害,而且能显著地提高系统的性能。在考虑数据存储方案时,有三种可行的选择,分别是文件方式、数据库方式、LDAP方式,这三种方式都有各自的优缺点。文件方式的好处在于简单直观,存取速度最快,但不够安全,在RBAC的早期版本中,我们采用的就是文件方式。LDAP方式可以保证数据的安全和完整性,但使用不方便,普及程度也不高;数据库方式是业界比较认可的主流存储方案,而且现在的数据库技术也比较成熟,是较为理想的选择。有鉴于此,我们在系统中采用了数据库方式作为本系统数据存储方案。以下为数据存储的表结构:1、P_YHB用户表用于记录用户基本信息。如表3-1所示。表3-1用户表编号列名类型长度说明约束1*YHIDVARCHAR8用户ID2YHMCVARCHAR20用户名称3YHMMVARCHAR25用户密码4SSBMVARCHAR5用户所属部门5YHMSVARCHAR500用户描述2、P_JSB角色表记录和角色相关和信息。如表3-2所示。表3-2角色表编号列名类型长度说明约束1*JSIDVARCHAR5角色ID2JSMCVARCHAR50角色名称3JSMSVARCHAR200角色描述可为空4JSXYHZDSNUMBER10此角色下的用户最大数可为空5JSLXVARCHAR1角色类型3、P_YHJSB用户角色表用于记录用户角色指派的内容,即记录每个角色被赋予了哪些用户。如表3-3所示。表3-3用户角色表编号列名类型长度说明约束1*YHIDVARCHAR8用户ID1.12*JSIDVARCHAR5角色ID2.14、P_GNB功能表存放权限,一条记录就是一个权限,一个权限指的是一个用户可以使用的一个功能项,在表中记录了该权限对应的主URL。如表3-4所示。表3-4功能表编号列名类型长度说明约束1*GNIDVARCHAR5功能ID2GNMCVARCHAR50功能名称3GNMSVARCHAR500功能描述可为空4ZURLVARCHAR200主URL5CZVARCHAR1操作(只读、读写、执行)5、P_JSJDB角色节点表记录权限角色指派的内容,即记录每个角色所拥有的权限信息。如表3-5所示。表3-5角色节点表编号列名类型长度说明约束1*JSIDVARCHAR5角色ID2.12*JDIDVARCHAR5节点ID6.16、P_JDB节点表记录每个节点信息。如表3-6所示。表3-6节点表编号列名类型长度说明约束1*JDIDVARCHAR5节点ID2.JDMCVARCHAR50节点名称3.FJDIDVARCHAR5父节点ID4JDMSVARCHAR500节点描述5JDNXHVARCHAR2节点内序号7、P_JDGNB节点表记录每个节点所包含的权限信息。如表3-7所示。表3-7节点功能表编号列名类型长度说明约束1IDVARCHAR1节点层次2*GNIDVARCHAR5节点ID3*JDIDVARCHAR5节点ID8、P_DEPARTMENT企业部门表记录每个企业部门所包含的部门信息。如表3-8所示。表3-8企业部门表编号列名类型长度说明约束1*DEPBMVARCHAR3部门编号2DEPMCVARCHAR100部门名称3DEPLXDHVARCHAR25部门联系电话4DEPMANAGERVARCHAR8部门负责人9、P_PROJECT企业工程项目表记录每个工程项目所包含的工程项目信息。如表3-9所示。表3-9企业工程项目表编号列名类型长度说明约束1*PRJBHVARCHAR20项目编号2PRJNAMEVARCHAR100项目名称3PRJMANVARCHAR20项目负责人11.14PRJMONEYVARCHAR40项目资金5PRJDATEDATE立项日期10、P_SALARY企业员工工资表记录每个企业员工的工资信息。如表3-10所示。表3-10企业员工工资表编号列名类型长度说明约束1*IDNUMBER工资帐单序号2SALARY_NUMVARCHAR10工资帐单金额3WORKERBMVARCHAR10员工编号11.14SALARY_DATEDATE工资帐单发放日期11、P_WORKER企业员工信息表记录每个企业员工的信息。如表3-11所示。表3-11企业员工表编号列名类型长度说明约束1*WORKERBMVARCHAR10员工编号2WORKERMCVARCHAR50员工姓名3WORKERAGEVARCHAR3员工年龄4WORKERSEXVARCHAR1员工性别5WORKERADDRESSVARCHAR200员工地址6WORKERLXDHVARCHAR50员工联系电话7WORKERZJHMVARCHAR50员工证件号码8WORKERDEPBMVARCHAR5员工所在部门8.13.2RBAC模型在系统中的实现 3.2.1系统功能模块的实现在功能管理模块中,用户可以进行的操作有:功能添加、修改和删除。系统功能添加的实现过程可以描述为:数据库浏览器数据库浏览器ActionForm类Action类提交表单Struts-config.xml封装表单数据调用查找JavaBean转向图3-1系统功能模块实现的流程图从图3-1可以看出,用户在试图添加一个系统功能时,应该首先填写表单,填写好表单后,点击表单的提交按钮之后,会触发一个请求事件(Action),该事件由页面的表单指定。在Struts-config.xml文档中找到相应的Action,同时得到该Action使用的ActionForm类。此时表单的数据将会保存到该ActionForm类中,在Action中就可以得到表单中的数据。为了完成最终的功能添加,在相应的Action实现类中,还需要调用模型层中的业务功能函数,来完成此次的业务逻辑。在相应的JavaBean中,完成与数据库的交互,实现对数据的添加。 用到的ActionForm类是GnoperatorForm类,该类继承ActionForm类,并具有gnid,cz,ljxjd,gnmc,gnms,zurl等属性。GnoperatorForm的部分实现代码如下:publicclassGnoperatorFormextendsActionForm{ privatestaticfinallongserialVersionUID=1L; privateStringgnid; privateStringcz; privateStringljxjd; privateStringgnmc; privateStringgnms; privateStringkfgb; privateStringzurl;……publicStringgetGnmc(){ returngnmc; } publicvoidsetGnmc(Stringgnmc){ this.gnmc=gnmc; } publicStringgetGnms(){ returngnms; } publicvoidsetGnms(Stringgnms){ this.gnms=gnms; } ……} 实现功能添加的Action类GnoperatorAction.java,部分实现代码如下:publicclassGnoperatorActionextendsAction{ publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){ ActionForwardnextdisplay=newActionForward();//生成一个ActionForward对象 Stringactionmappingpara=mapping.getParameter();//接收ActionMaping的参数 if("gnoperator".equalsIgnoreCase(actionmappingpara)){ nextdisplay=gnoperator(mapping,form,request,response); }elseif("gnoperator_update".equalsIgnoreCase(actionmappingpara)){ nextdisplay=gnoperator_update(mapping,form,request,response); }elseif("gnoperator_getgn".equalsIgnoreCase(actionmappingpara)){ nextdisplay=gnoperator_getgn(mapping,form,request,response); } returnnextdisplay; }//完成功能添加的实现方法 publicActionForwardgnoperator(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){ GnoperatorFormgnof=(GnoperatorForm)form; ActionForwardforward=newActionForward(); Stringmethod=(String)request.getParameter("method"); dbOpdb=newdbOp(); response.setCharacterEncoding("gbk"); if(method.equalsIgnoreCase("insert")){ //新增功能 if(db.insertintoGnb(gnof)){ gnof.setGnmc(""); gnof.setGnms(""); gnof.setZurl(""); gnof.setZimc(null); gnof.setZims(null); gnof.setZiurl(null); request.setAttribute("result","success"); forward=mapping.findForward("success"); }else{ request.setAttribute("result","failure"); forward=mapping.findForward("failure"); } }elseif(method.equalsIgnoreCase("update")){ //更新功能 if(db.UpdateGnb(gnof)){ request.setAttribute("result","更新成功"); forward=mapping.findForward("successupdate"); }else{ request.setAttribute("result","更新失败"); forward=mapping.findForward("failureupdate"); } } db.close(); returnforward; } ……} 完成功能添加的业务函数存放在dbOp类中,它的部分实现代码如下:publicclassdbOpextendsDBOperator{ /** *插入一个新的功能 */ publicbooleaninsertintoGnb(GnoperatorFormgnof){ Stringgnmc=this.toGBK(gnof.getGnmc()); Stringzurl=this.toGBK(gnof.getZurl()); Stringgnms=this.toGBK(gnof.getGnms()); Stringljxjd=gnof.getLjxjd(); booleanb=false; Stringsql="insertintop_gnb(gnid,gnmc,gnms,zurl,cz,ljxjd,sfglip,kfgb)" +"values(p_gnidxl.nextval,'"+gnmc+"','" +gnms +"','"+zurl+"','1','"+ljxjd+"','0','1'"+")"; try{ Statementinsert_stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); insert_stmt.execute(sql); b=true; insert_stmt.close(); }catch(SQLExceptione){ e.printStackTrace(); } returnb; }……//其他业务函数}3.2.2系统权限模块的实现为了方便的进行权限的设置和角色的管理,借助SWTDesigner(Eclipse的一个插件,专门用来有界面的Java应用程序)开发了一个专门用于管理权限节点和系统角色的应用程序。具体的实现类如下所示。/**节点的管理类*/publicclassNodeMan{ publicStringnodeid;//节点id publicStringnodename;//节点名称 publicStringifparent;//是否是父节点 publicStringnodedes;//节点的描述信息 publicStringgnid;//功能id publicStringgnmc;//功能名称 publicStringgnms;//功能描述 publicStringgnnxh;//功能内序号 publicStringjdnxh;//节点内序号……/**添加父节点 */ publicbooleanaddparnode(Stringnodename,Stringifparent,Stringnodedes, Stringjdnxh){ booleanflag=false; try{ pstmt=con .prepareStatement("insertintop_jdb(jdid,jdmc,fjdid,jdms,jdnxh)" +"values(p_jdidxl.nextval,?,?,?,?)"); pstmt.setString(1,nodename); pstmt.setString(2,ifparent); pstmt.setString(3,nodedes); pstmt.setString(4,jdnxh); pstmt.executeUpdate(); flag=true; }catch(SQLExceptione){ e.printStackTrace(); flag=false; }finally{ this.close(); } returnflag; }/*修改某一个节点的信息 */ publicbooleanUpdateNodeInfo(Stringnodename,Stringnodedes,Stringnodeid){ booleanflag=false; try{ pstmt=con .prepareStatement("updatep_jdbsetjdmc=?,jdms=?wherejdid=?"); pstmt.setString(1,nodename); pstmt.setString(2,nodedes); pstmt.setString(3,nodeid); pstmt.executeUpdate(); flag=true; }catch(SQLExceptione){ e.printStackTrace(); flag=false; }finally{ this.close(); } returnflag; }……}3.2.3系统角色模块的实现系统中角色的实现类是RoleMan.java,部分代码如下所示。/***角色的管理类*/publicclassRoleMan{ publicStringroleid;//角色id publicStringrolename;//角色名称 publicStringroledes;//角色描述 publicStringrolemaxnum;//角色下的用户最大数/*增加一个角色*/ publicbooleanaddrole(Stringrolename,Stringroledes,Stringrolenum, Stringroletype){ booleanflag=false; try{ pstmt=con .prepareStatement("insertintop_jsb(jsid,jsmc,jsms,jsxyhzds,jslx)" +"values(p_jsidxl.nextval,?,?,?,?)"); pstmt.setString(1,rolename); pstmt.setString(2,roledes); pstmt.setString(3,rolenum); pstmt.setString(4,roletype); pstmt.executeUpdate(); flag=true; }catch(SQLExceptione){ e.printStackTrace(); flag=false; }finally{ this.close(); } returnflag; }/**更新某个角色的信息*/ publicbooleanChgrolebyId(Stringrolename,Stringroledes,Stringrolenum, Stringroleid){ booleanflag=false; try{ pstmt=con .prepareStatement("updatep_jsbsetjsmc=?,jsms=?,jsxyhzds=?wherejsid=?"); pstmt.setString(1,rolename); pstmt.setString(2,roledes); pstmt.setString(3,rolenum); pstmt.setString(4,roleid); pstmt.executeUpdate(); flag=true; }catch(SQLExceptione){ flag=false; e.printStackTrace(); }finally{ this.close(); } returnflag; }……}3.2.4为用户设置角色添加完系统功能,建立好权限节点,此时节点和系统的功能关联在一起;建立好角色并为某个角色分配好节点之后,系统角色与系统的功能就建立了关联,最后一步就是将系统用户和建立的系统角色建立关联,为某用户设置某一角色,设置好之后,该用户就可以获取该角色关联到的所有系统功能。 用来实现这一功能的Java类是dbOp.java,具体实现代码如下。 publicclassdbOpextendsDBOperator{ /** *为一组用户设置角色 */ publicbooleaninsertYhJs(Stringjsid,Stringyhid[]){ Stringsql=""; booleanb=false; try{ for(inti=0;i<yhid.length;i++){ sql="insertintop_yhjsb(jsid,yhid)values('"+jsid +"','"+yhid[i]+"')"; this.insertRecord(sql); } b=true; }catch(Exceptione){ System.out.println(e); b=false; } returnb; } /** *删除用户角色 */ publicbooleandeleteYhJs(Stringyhid,Stringjsid){ booleanb=false; Stringsql="deletep_yhjsbwhereyhid='"+yhid+"'andjsid='" +jsid+"'"; try{ PreparedStatementdelete_stm=con.prepareStatement(sql); delete_stm.executeUpdate(); delete_stm.close(); b=true; }catch(Exceptione){ System.out.println(e); b=false; } returnb; }……}3.2.5用户权限功能树的生成在实现了RBAC模型的Web系统中,每个用户(设置好某个系统角色之后)登陆成功之后,会在页面的左侧看到相应的权限功能树,即表示该用户对系统拥有的管理和使用权限。权限功能树的生成,需通过如下几个步骤:(1)首先根据用户的ID获取该用户的角色ID,有了角色ID之后,接着要根据角色ID获取该角色ID对应的权限ID,有了权限节点ID,就可以获取该节点ID下对应的所有功能。实现代码如下。 /** *获得用户的权限树 */ publicArrayListgetUserTree(StringuserId){ ArrayListarray=newArrayList(); Stringsql="selectp_jdb.*from(select*from(select*fromp_yhjsbwhereyhid='" +userId +"')b,p_jsjdbwhere" +"p_jsjdb.jsid=b.jsid)yhjs,p_jdbwhereyhjs.jdid=p_jdb.jdid"; try{ query_statement=sql; result=null; result=this.getResult(); while(result.next()){ oneTreeonetree=newoneTree(); onetree.setId(result.getString("jdid")); onetree.setName(result.getString("jdmc")); onetree.setPid(result.getString("fjdid")); onetree.setTitle(result.getString("jdms")); array.add(onetree); Stringjdid=result.getString("jdid"); this.foronjdid(jdid,array);//对某个节点进行处理 } }catch(Exceptione){ } returnarray; }/** *权限树的实体类 */publicclassoneTreeimplementsSerializable{ Stringid;//中节点的ID Stringpid;//上面节点的父节点 Stringname;//树中节点显示的名字 Stringurl;//树中节点对应的主URL Stringtitle;//鼠标移到节点时的提示 Stringtarger;//点击此url时新窗口出现的位置; Stringicon;// Stringiconopen; Stringopen;……}(2)在获取了该用户的所有权限节点和功能列表后,就需要某种机制来实现在页面上显示成一个树的形状,在系统中使用了一个开源的dtree.js(一个用JavaScript实现的程序)和dtree.css(一个用来规定显示格式的样式表文件),借助它们,就可以将获取的权限和功能列表以树的形式显示在页面上。这两个文件存在于系统的根目录中。

第四章系统测试 4.1系统测试4.1.1测试环境测试环境下使用的操作系统是WindowsXP(SP2),cpu为P42.4GHz,内存256兆。软件环境是:Eclipse,MyEclipse,并使用SWTDesigner作为Eclipse的插件。Web服务器是Tomcat,开源软件。使用的后台数据库服务器是Oracle9i,提供了数据的安全性和稳定性。4.1.2测试方案为了验证RBAC模型在具体系统中的访问控制效果,进行了如下的测试。(1)合法用户的合法登陆假定系统中存在公司经理(为经理设置了经理的角色),某员工张三(为其设置了员工的角色)和系统的管理员(为其设置了系统管理员的角色),在他们输入了正确的用户名和用户密码后,将分别进入如下图所示的页面。图4-1公司经理登陆成功看到的操作界面图4-2公司员工张三登陆成功看到的操作界面图4-3系统管理员登陆成功看到的操作界面(2)非法用户的访问存在三种情况,其一是用户名是错误的,即该用户不被系统承认;其二是合法用户的登录密码错误;最后一种是用户名是非法的,密码也是错误的。图4-4非法用户登陆时看到的操作界面(3)合法用户的登陆(未设置角色)假定有员工王五,但是还没有为他设置系统角色,那么他登陆后将看到如图4-5所示的页面。图4-5合法用户(未设置角色)登陆后看到的页面4.2总结与展望 基于角色的访问控制模型RBAC是目前主流的访问控制模型,它比传统的自主访问控制和强制访问控制更优越,同时也提供了更高的灵活性和扩展性。RBAC访问控制模型实现了用户与访问权限的逻辑分离,减少了授权管理的复杂性,降低了管理开销和管理的复杂度。对于现在规模日益增大的基于B/S架构的信息管理系统来说,采用RBAC访问控制模型的访问控制模块将会起到越来越大的作用。本文分析MVC商务网站系统的特点和优势,并就在网站访问控制上将强制访问控制、自主访问控制与当前广泛使用的RBAC模型进行了分析和比较,得出RBAC模型在MVC应用系统中的优势,并根据最新的商务网站需求,提出了一个改进的RBAC模型,介绍了该模型的定义和特点,并给出了一个利用该模型设计的一个企业商务管理系统的实现。本方案有足够的灵活性,对Web页面的控制能达到较好的效果。为更真实的描述现实,ERBAC模型增加了许多的控制机制。如对页面多维度和细粒度控制,对角色、功能、节点的静态限制和对角色的动态限制。对页面的限制主要是限制用户在特定时间和特定地点所能看到的功能和所能进行的操作。其他限制主要是在功能被赋予节点时、节点被赋予角色时和角色被赋予用户时的限制。模型中有了这些限制才更完整、更真实地反应现实,从而使实际模型细化的过程更加平滑,现实和计算机实现策略达到较好的融合。另一方面,RBAC在实际Web应用中仍存在一些不足,比如它进行了过多的抽象,对现实的模拟不够。本文通过改进的RBAC模型对这些不足提出一些局部解决方案。除此之外,在对RBAC功能的扩展中还有些是很值得去研究的,比如角色生存周期以及角色根据状态动态变更权限等。但是由于本模型实现时的数据是以关系表的形式存储在ORACLE数据库中的,虽然实现起来简单方便,但是环境配置要求较高,且不利于向其它数据库的移植。下一步的工作目标是用MYSQL或SQL-SERVER来存储模型实现数据,基于STRUTS开发一个RBAC标签库,利用标签来进一步进行Web页面的访问控制。4.3致谢漫长的四年大学生活就要结束了。在我即将离开之际,回首过去,感慨万千。在这里我要感谢各科目的老师对我的辛勤栽培,感谢同学朋友对我的鼓励,感谢母校能够提供给我这么良好的学习环境,特别要感谢陆悠老师在长达半年的毕业设计期间对我的指导和教诲,没有他们就没有我的这篇毕业论文。相信我在踏上社会这个大舞台后,一定不会辜负所有人的期望,走出属于自己的一片天!

参考文献[1] SandhuRS,CoyneE,FeinsteinH,etal.Role-BasedAccessControlModels.IEEEComputer,1996,29(2):38-47[2]倪晚成、刘连臣、刘伟,基于角色—页面模型的WEB用户访问控制方法[J].计算机工程与应用,2006,21125~126[3] 甘泉,贺也平,韩乃平.一种改进的基于角色的访问控制.《计算机工程》,2006(7):140-142[4] 郭慧,李阳明,王丽芬.基于角色和任务的访问控制模型的设计与研究.《计算机工程》,2006(16):143-145[5] 李沛武,卢正鼎.RBAC角色区间的封装和分布式管理.《小型微型计算机系统》,2005(2):252-255[6] 孙永,王雄.一种域增强的RBAC模型及其管理模型.《计算机工程与应用》,2005(6):60-64[7](美)史迪文斯(Stevens,W.R.).UNIX环境高级编程.机械工业出版社,2000[8]孙卫琴,李洪成.Tomcat与JavaWeb开发技术详解.电子工业出版社,2004[9]孙卫琴.精通Struts:基于MVC的JavaWeb设计与开发.电子工业出版社,2004

附录A:英文原文Role-BasedAccessControlfortheWebJohnF.Barkley,D.RichardKuhn,LynneS.Rosenthal,MarkW.Skall,andAnthonyV.Cincotta,Nationa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论