MVC网站开发的权限管理
一、前言
到公司后没多久就接触到MVC了。我现在无法理解。我只能说我到了以后会用这个级别。我写Web的时候感觉MVC很强大很清晰。
今天我要写权限管理。感觉网站的权限主要分为菜单权限和角色权限。首先说说角色权限。不同的角色可以看到不同的页面。这是角色权限,菜单权限也可以说是操作权限,具体到某个按钮或者某个下拉框。
二、角色权限
1.用户角色
首先,我们来谈谈角色权限。每个用户都有不同的角色和一对多的关系。
2.菜单管理
在菜单管理中,我们可以这样管理。用标记控制某个菜单、某个角色更容易。
3.数据库资料库
查看数据库,应该有一个角色表和一个用户与角色关系表。
然后是角色和菜单之间的关系表,其中PermissionIDs字段是由|分隔的操作权限。
4.用户登录
当用户登录时,我们可以根据登录人的ID获取他的所有角色并保存在Session中,并根据登录人找到相应的菜单。
//角色基本信息sqlhelperparameter sqlhelperparameter角色=new sqlhelperparameter();sqlHelperParameterRole。添加(' UserId ',dtUserRow['UserId'])。ToString());DataTable dtRole=SqlHelper。执行数据表(@)选择系统角色。角色标识,系统角色。角色名,系统角色。权重从(选择用户标识,从系统用户角色中选择角色标识,其中用户标识[电子邮件保护])作为系统角色的左连接。RoleId ',sqlHelperParameterRole);int dtRoleCount=dtRole。行。计数;RoleWeightMax=int。MaxValuefor(int I=0;i dtRoleCountI){ roles session RS=new roles session();rs。RoleID=Guid。解析(dtRole。行[i]['RoleId']。ToString());rs。RoleName=dtRole。行[i]['RoleName']。ToString();rs。重量=转换。to t32(DTrole。行[i]['重量']);if (RoleWeightMax rs。重量){ RoleWeightMax=rs。重量;} RoleList。add(RS);}公共类RoleSession { public Guid RoleID { get;设置;}公共字符串RoleName { get设置;}//Weight public int Weight { get;设置;}}前台代码:
div data-options=' region : ' west ',split : true ' title=' navigation menu ' style=' width : 200 px;padding1: 1px'隐藏飞越:'id=' left _ nav ' div class=' easui-accordion ' data-options=' fit : true,border : false ' @ h9c . PMS . bll . logon . menulist . getmenu(viewpag . username)/div/div控制器:
公共静态MvcHtmlString GetMenu(字符串用户名){菜单菜单=新菜单();菜单结构ms=菜单GetMenuListStructure(用户名);如果(ms!=null){ ms . children。移除(儿童女士。first or default(o=o . model code==' 0 ' o . ParentId==' 0 ');}返回新的MvcHtmlString(MenuNav('0 ',ms));}私有静态字符串MenuNav(字符串menuCode,menustrstructure menuStruc){ if(menuStruc==null){ return ' div没有可用菜单/div ';} list menustrstructure list=menuStruc .儿童。其中(m=m.ParentID==menuCode).to list();StringBuilder sbMenu=new StringBuilder();foreach(列表中的定义变量项目){ if(项目ParentID=='0') { sbMenu .追加(' div title=\ '项title “\”style=\”溢出: auto\'');sbMenu .追加(“ul id=\”菜单'项目ParentID ' \ ' class=\ ' measuri-tree ' animate=\ ' true ' dnd=\ ' true \ ');sbMenu .追加(“李”);} else { sbMenu .追加(“ul id=\”菜单'项目ParentID ' \ ' class=\ ' measuri-tree ' animate=\ ' true ' dnd=\ ' true \ ');如果(项目。儿童。计数==0) { sbMenu .追加(“李”);} else { sbMenu .追加(' li '状态=\ ' closed \ ');} } sbMenu .追加(“span”);如果(项目Url=='/') { sbMenu .追加(' a class=\ ' e-子菜单href=\ ' JavaScript : void(0);\' title=\ '项。标题' \ ');} else { string tabsIcon=' 14if(!字符串IsNullOrWhiteSpace(项图标){标签=项目.图标。替换('/内容/图像/',' ')。替换('。png ',' ');} sbMenu .追加(' a class=\ ' e-子菜单href=\ ' # \ ' onclick=\ ' AddTab(' item .Url ' ',项目' '。标题' ')\ ' ');sbMenu .追加(“img src=\”项。图标' \ ');} sbMenu .追加(""项。标题' ');sbMenu .追加('/a/span ');if (IsExistParent(item .型号代码,项目)){ sbMenu .追加(MenuNav(项模型代码,项目));} sbMenu .追加('/Li ');sbMenu .追加('/ul ');如果(项目ParentID=='0') { sbMenu .追加('/div ');} }返回sbMenu .ToString();}私有静态bool IsExistParent(字符串modelCode,menustrstructure menuModels){ var query=menuModels .孩子们。first ordefault(m=m . ParentID==模型代码);if(query==null){ return false;}返回真}菜单类:
公共类menustrstructure {公共字符串模型代码;公共字符串标题;公共字符串图标;公共字符串全球资源定位器(Uniform Resource Locator)公共字符串ParentIDpublic list menustrstructure Children=new list menustrstructure();}其中GetMenuListStructure()方法就是根据用户名获取菜单列表结构,我这里用户名在数据库中是唯一的,在这里注意一点比较麻烦的是根据类可以看出菜单是有父菜单子菜单的所以方法中需要有两个循环去添加。
三、菜单权限也就是操作权限,比如某一按钮的操作权限。首先我们把所有关于按钮的操作权限存放到一个类中,(有更好的方法请向我推荐谢谢)
公共类菜单{ public static int龚丹=503000000;//任务工单} 然后我们需要操作权限的按钮所在的页面的控制器(加载页面)中存到视图包里,如下:
公共行动结果索引(){H9C .新BLL .RBAC。许可();视图包IsReportPlan=pm .IsRoleHavePermissions(角色。石工堆账,菜单,工单,基地。用户会话模式,菜单。宫丹报告计划(宫丹报告计划);//上报施工计划返回视图();}///摘要///判断某权限是否在获取某角色权限的列表中////summary///param name=' RoLeid '/param///param name=' model code '/param///param name=' userSessionModel '/param///param name=' permissionCode '/param///返回/返回公共bool isroleid有权限(Guid RoLeid,int modelCode,userSessionModel userSessionModel,int permissionCode){ listpressionmodel permissionmodelist=this .GetRolePermissionList(roleId,modelCode,userSessionModel);if(permissionmodelist==null){ return false;} foreach(permissionmodelist中的var o){ if(o . PCode==permissionCode){ return true;} }返回false }////摘要///获取某角色权限的列表////summary////param name=' RoLeid '/param///param name=' model code '/param///param name=' usersessionmodel '/param///返回/返回公共列表权限模型GetRolePermissionList(Guid RoleID,int modelCode,user ssessionmodel user ssessionmodel){ foreach(user session model中的var o ).角色列表){ if(o . RoLeid==RoLeid){ listmode .RBAC .许可模型许可列表=这个PermissionList(roleId,模型代码);返回权限列表;} }返回null }////摘要///获取某菜单某角色下具有的权限////summary////param name=' MoDEL id '/param///param name=' Menuid '/param///returns/returns public lispermissionMoDEL permissionList(Guid RoLeid,int Menuid){ LispermissionMoDEL PMList=new LispermissionMoDEL();正在使用(RBAC上下文连接=新RBAC上下文()){ Sys _ Role _ Model _ Permissions srmp=连接.系统_角色_模型_权限. first or default(o=o . model id==Meuid o . RoLeid==RoLeid);if (srmp!=null){ 0字符串权限=srmp .权限标识;if(!字符串isnullorhitespace(permissions)){ string[]pids=permissions .拆分(新字符[]{"|"});for(int I=0;我尿裤子了。长度;i ) { if(!字符串isnullorhitespace(pids[I]){ PMLiST .添加(新PermissionModel(){模型代码=menuId,PCode=Convert .ToInt32(pids[i]),PName=' ' });} } } }返回pmList}最后一个方法中运用到了仰角指示器根据菜单以及角色获取某菜单某角色下具有的权限前台就非常简单的:
@ if(viewpag .isreportPlan==true){ @ : a href=' # ' class=' measuri-link button l-BTN ' icon cls=' icon-add '按钮/a }四、尾声
总结一下,就是首先要有一个菜单管理的模块,它不但可以管理菜单还可以管理菜单中的权限以及每个角色关于菜单的权限,然后就是后台的控制,上面权限模型中存的权重,指的是每一角色都有权重,每一个用户都有他的最大权重,根据这个权重我们就可以做很多条件的控制,简单的说也是为了方便吧。第一篇技术文档,文笔还需要多锻炼,以后会试着多写博文,不会写文档的码农不是好程序员。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
版权声明:MVC网站开发的权限管理是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。