角色访问动态生成用户权限菜单树.doc_第1页
角色访问动态生成用户权限菜单树.doc_第2页
角色访问动态生成用户权限菜单树.doc_第3页
角色访问动态生成用户权限菜单树.doc_第4页
角色访问动态生成用户权限菜单树.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

角色访问动态生成用户权限菜单树一、引言随着.net和j2ee开发平台的推出,传统的软件开发模式开始向b/s模式转变,这种转变给系统的安全性提出了更高的要求,b/s模式下,由于http协议和浏览器的特殊性,可能会造成信息的泄漏甚至使非法用户修改数据。而权限的设置、分配与管理是任何一个系统必不可少的功能。如何设计与实现其功能,目前有多种方案,传统的访问控制方法dac(discretionary access control,自主访问控制模型)、mac(mandatory access control,强制访问控制模型)难以满足复杂的企业环境需求。本文采用了现在流行的基于角色访问控制(rbac,role based access control)的基本思想,巧妙地利用了web控件treeview及asp.net技术,设计了在b/s模式下,根据不同的用户,不同的角色权限,动态生成用户菜单树的一种具体实现方法。本文将先介绍rbac的基本思想,在此基础上,给出在asp.net中的具体实现方法。二、角色访问控制(rbac)的基本思想usersrolespermissions 图1rbac的基本思想在rbac中,许可permissions(特权)就是允许对一个或多个客体执行的权力,角色就是许可的集合,如图1所示。rbac的基本思想就是把整个访问过程分为两步:访问权限与角色关联,角色再与用户关联,从而实现了用户与访问权限的逻辑分离。rbac对访问权限的授权由系统管理员统一管理,系统管理员根据单位中不同的岗位定义不同的角色,用户根据其职能和责任被赋予相应的角色。一旦用户成为某角色的成员,则此用户可以完成该角色所具有的职能。由于rbac实现了用户与访问权限的逻辑分离,因此它极大地方便了权限管理的复杂性。可根据用户的实际工作岗位将用户与角色关联,一方面定义角色、增加删除角色中的用户易于操作,另一方面,可以通过更改角色的权限实现大批量用户权限的更新。在实际应用中,由于角色/权限之间的变化比用户/角色之间的变化要慢得多,当一个用户的职位发生了变化,只要将用户当前的角色去掉,加入代表新职务的角色即可。因此,rbac的优点是明显的,更符合企业的应用特征。三、用户权限菜单树用treeview控件动态实现用户权限菜单树的基本思想是:根据角色访问控制(rbac)的基本原理,给用户分配不同的角色,每个角色对应一些权限,然后根据用户id获取用户对应的角色集合,由角色集合获取对应的权限集合,再由权限集合利用treewiew控件动态生成一棵由该用户对应的角色能访问的页面(模块)组成的权限树。这样,用户无权访问的页面在权限菜单树就不会出现,不同的用户进入的界面不同,实现了用户权限的统一管理。下面从功能模块设计、数据库设计、架构设计等几方面来阐述其实现过程。1功能模块划分图2用户权限管理功能模块图用户权限管理系统功能如图2所示,其中主要模块功能阐述如下:用户管理模块分为:删除用户、浏览用户和角色分配三个子模块,主要负责各类用户的删除、合法性验证及为用户分配角色。用户管理模块中并没有增加用户子模块的功能,主要是由用户注册模块来实现的。权限管理模块分为:角色管理和访问控制两个子模块。角色管理负责管理各类角色(增、删、改),为角色授予相应信息服务模块的使用权限,删除角色的某个模块的使用权限等;访问控制是保证信息安全的关键,用户登录时经身份验证后,系统根据用户具有角色的信息服务模块的使用权限自动生成访问权限集,使得用户能够访问授权的信息,拦截对没有授权信息服务的访问。2.数据库设计在实施rbac生成用户权限菜单树时,为了提高系统管理及数据访问的效率,在数据库中设计了用户表(表1所示)、角色表(表2所示)、用户角色表(表3所示)、角色权限表(表4所示)及菜单树结构表(表5所示)共5个表。表1用户信息表users字段名类型字段中文名useridint用户id主键usernamevarchar(50)用户名passwordvarchar(100)用户密码用md5加密realnamevarchar(50)用户真实姓名emailvarchar(100)用户emailstateint用户状态,默认:0baoliuchar(1)保留,默认:1表2角色信息表roles字段名类型字段中文名roleidint角色id主键rolenamevarchar(20)角色名称用md5加密roledescvarchar(50)角色描述permissionvarchar(50)角色权限baoliuchar(1)保留,默认:1表3用户角色表userroles字段名类型字段中文名roleidint角色iduseridint用户id表4角色权限表rolepermissions字段名类型字段中文名roleidint角色idtreeidint菜单idparentidint父菜单id表5菜单树结构表tree字段名类型字段中文名treeidint菜单id主键titlevarchar(200)菜单标题desntext(16)菜单描述parentidint(4)菜单父idurlvarchar(200)菜单链接地址web程序中,将系统功能模块组织成树型结构,每个模块对应一个菜单,菜单之间的父子关系直接反映了模块之间的父子关系,在数据库中用一张表tree来存储这种结构。5个表的关系如图3所示。图35个表之间的关系图3.系统架构设计b/s模式下,采用三层结构:表示层、逻辑层及数据层。为了编程方便,把数据层分为实体层和数据访问层,把打开、关闭数据库及调用存储过程的代码全部封将在数据访问类sqlhelper.cs中。实际应用中采用的是四层结构,系统架构设计如图4所示。图4用户权限管理架构图注:图4中的箭头为调用关系。为了提高程序的执行效率,所有的数据操作都是通过类sqlhelper.cs调用存储过程来实现的。实体层的几个主要类及关键方法如下:(1)用户类user:getuserlogin(string susername,string spassword):用户登录验证。getrolebyuser(int nuserid):由用户id返回该用户所有的角色集。 adduserrole(int nuserid,int nroleid): 为用户分配角色。getuserpermissionlist( int userid ):得到用户的所有权限集。(2)角色类roleentity:addrolemodule(int ntreeid,int nroleid):为角色分配权限。deleterolemodule(int nroleid):删除角色拥有的权限。getmodulebyrole(int nroleid):由角色id得到该角色的权限集。(3)权限树类tree:bindtree(treeview treeview,int userid):生成树目录。createchildnode(treenode parentnode,datatable datatable):递归函数生成树结点。gettreesbyuserid(int nuserid):由用户id得到用户权限集动态生成用户权限树。(4)用户权限检查类ckeckauthority:chkpermission( int userid ):检查用户是否有访问权限。isinrole(int roleid):检查角色是否存在。4具体实现在树型结构中,给角色授权时采取简单方式,每次授权时,将其对应的roleid、treeid及parentid存入rolepermissions表中,见图5。图5角色授权要实现动态生成用户菜单树,在asp.net开发环境中必须安装微软的ieweb控件(可到微软的网站免费下载),安装完成后,在开发环境中引用microsoft.web.ui.webcontrols.dll,这样在开发环境的工具箱中将会出现mutipage、tabstrip、toobar和treeview等ieweb控件。将ieweb控件treeview添加到web页分以下两步:(1)在页面顶端添加以下register指令:(2)在web页中需显示treeview的位置添加以下web控件语法: 关于treeview控件的用法,读者可参看相应的书籍。总体架构页面包括用户登录(longin.aspx)和主界面(default.aspx)两个部分。主界面分为三个部分:上部分为标题条(head.aspx),左部分为菜单目录树(lefttree.aspx),右部分主框架(mainfram.aspx)。其中lefttree.aspx页面含treeview控件,用户单击树中的菜单结点就可打开相应的操作页面。用户登录采用窗体式验证,负责提供用户的身份验证。然后根据用户在系统中所扮演的角色,取出该用户对应的权限集,动态生成该用户对应本系统的操作权限树(见图6)。图6用户访问权限示意图登录体login.aspx中的主要代码如下:private void loginbtn_click(object sender, system.eventargs e)if(page.isvalid = true)entity.user user=new user();string userid = ;string isvalid=;/用户的合法标志/用户身份鉴别sqldatareader recs = user.getuserlogin(username.text.trim(),entity.user.encrypt(password.text.trim();if(recs.read() userid = recsuserid.tostring();/取到用户的合法标志 isvalid=recsstate.tostring();recs.close();if(isvalid=0)/用户没有被系统管理同确定,转向访问拒绝面response.redirect(accessdenied.aspx);if(userid != null) & (userid != ) sessionuserid =userid;entity.ckeckauthority chkau=new ckeckauthority();/用户访问权限检验if(!chkau.chkpermission(int32.parse(sessionuserid.tostring() / 如无权限直接转向访问拒绝面response.redirect(accessdenied.aspx);else/用户有访问权限,创建用户名,密码验证的票据 formsauthenticationticket ticket = new formsauthenticationticket( 1, / version 版本 username.text.trim(), / 用户cookie名 datetime.now, / 发布日期 datetime.now.addhours(1),/过期日期 false, /cookie 持久性(false) password.text.trim() / 用户密码); / 加密票据string cookiestr = formsauthentication.encrypt(ticket); / 将存有用户名、密码信息的字符串存入cookieresponse.cookiesuserticket.value = cookiestr; response.cookiesuserticket.path = /; response.cookiesuserticket.expires = datetime.now.addminutes(1); /跳转到由用户权限动态生成的主页面response.redirect(default.aspx); elseusername.text = ;password.text = ;message.text = 你输入的用户名称或者密码有误,请重新输入!;lefttree.aspx中的主要代码如下:private void page_load(object sender, system.eventargs e) if(!page.ispostback) / 实例化一个树对象tree tree = new tree();/动态创建树型菜单,参数moduletview为treewview控件对象 tree.bindtree(moduletview,int32.parse(sessionuserid.tostring();此外,为了防止非法用户直接绕过登录验证窗体而在网址中直接输入访问路径进行非法访问,利用asp.net中的用户控件,直接将票据验证、角色验证封装在用户控件checkuserauth.ascx中,在每一个受控的页面中加入用户控件checkuserauth.ascx,若为非法用户直接转向拒绝访问页accessdenied.aspx,这样使得系统更加安全可靠。有关web.config中基于forms验证的配置方法,本文不再赘述。运行效果:角色分别为成绩管理员和系统管理员的菜单树如图7和图8所示。图7角色为成绩管理员的菜单树图8角色为系统管理员的菜单树四、结语在b/s模式下,信息系统的安全设计有了新的需求,相对于传统的c/s应用程序,b/s应

温馨提示

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

评论

0/150

提交评论