




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
a mvc权限设计思考 (一)数据库建库部分 目前各类的权限设计已经困扰了我们好久,对于mvc,下面我将通过actionfilter来扩展我们的权限认证,以下示例是从我的一个课程中心项目中提取出来,希望对各位初学者起到抛砖引玉的作用。下面首先来设计我们的权限控制的数据库层。下面我来依次介绍每个字段的说明rolegroup 权限组表 该表主要对系统权限进行分组,我们的用户可以直接赋予该分组,拥有所有该组权限roleid 权限组id 例:01rolename 权限组名称 例:系统管理员rolestate 组状态 (是否启用) 例:truerolegroupapplist 表 组权限对应表 该表主要复制每个权限组对应的权限详细列表id id主键 例:1roleid 对应权限组的id 例:01sysappid 对应的详细权限组id 例:01starttime 该权限使用的起始日期 例:2009-01-01 ,该字段属性默认为:all ,即不限制起始日期endtime 该权限使用的结束日期 例:2009-01-01 ,该字段属性默认为:all ,即不限制结束日期sysappcate 表 该表主要是对sysapplist详细权限表做分类,当我们的权限页面特别多的时候,该表主要为了方便管理。可省略sysappcateid 大类id 例:01sysappcatename 大类名称 例:新闻管理sysappcateename 大类英文名sysapplist 权限详细表 该表主要负责所有权限的基础列表sysappid 权限id 例:01sysappcateid 权限大类id 例:01sysappname 权限名称 例:新闻添加sysappename 权限英文名称sysappcontroller 权限对应的controller 例:newssysappaction 权限对应的action 例:add 本权限设计针对对action权限限制isview 是否为可见 例:true 该字段的设计主要是便于后台的管理和设置,因为有部分action是没有view层的,比如post,但是在后台权限管理中我们又要用到他。好了,建库部分就到这里了,下一篇我会介绍逻辑部分,其中会涉及到repository模式,缓存,自定义的authorizeattribute。a mvc权限设计思考 (二)逻辑部分实现 在我的项目中,我还是使用的linq to sql ,因为我的项目不会涉及太多很太复杂的数据库操作业务。当然如果设计,我相信linq to sql的自定义扩展也能满足需求。使用repository模式是最近mvc很多项目采用的解决方案,能把原来我们杂乱的linq to sql统一封装起来。让我们的架构更清晰。现在来看看具体实现。irepository接口:代码 interfaceirepositorywheretentity:classiqueryablefindall(expressionfuncexp);tentityfind(expressionfuncexp);voidadd(tentityentity);voiddelete(tentityentity);voidsave();repository实现:代码 publicclassrepository:irepositorywheretentity:classprotecteddal.coursecenterdatadb;publicrepository()db=newdal.coursecenterdata();/查找所有数据/publiciqueryablefindall()returndb.gettable().where(p=1=1);/查找所有数据/条件表达式/publiciqueryablefindall(expressionfuncexp)returndb.gettable().where(exp);/查找一个数据/条件表达式/publictentityfind(expressionfuncexp)returndb.gettable().firstordefault(exp);/添加数据/实体publicvoidadd(tentityentity)db.gettable().insertonsubmit(entity);/删除数据/实体publicvoiddelete(tentityentity)db.gettable().deleteonsubmit(entity);/批量添加数据/实体列表publicvoidaddall(ienumerableentity)db.gettable().insertallonsubmit(entity);/批量删除数据/实体列表publicvoiddeleteall(ienumerableentity)db.gettable().deleteallonsubmit(entity);/对数据做插入,更新,删除操作/publicvoidsave()db.submitchanges();网上已经有很多repository的例子,但是请注意find中的条件必须是expression tree的扩展,否则在数据查询的sql语句中,你会发现捕获到的将是select一个表之后再来做数据的查询,这在我们海量数据查询时不允许的。现在我们已经有了自己的repository,下面来建立一个数据库视图把我们上一讲需要的数据拿出来。新建视图viewrolegroup,选定一下表和字段我们通过vs2008新建一个linq to sql类,拖入这个视图。然后我们需要思考,这个权限分组视图是系统频繁读取的,需要为他创建一个缓存。新建一个缓存类caches:代码 /缓存操作基类/publicclasscaches/建立缓存/publicstaticobjecttryaddcache(stringkey,objectvalue,cachedependencydependencies,datetimeabsoluteexpiration,timespanslidingexpiration,cacheitemprioritypriority,cacheitemremovedcallbackonremovedcallback)if(httpruntime.cachekey=null&value!=null)returnhttpruntime.cache.add(key,value,dependencies,absoluteexpiration,slidingexpiration,priority,onremovedcallback);elsereturnnull;/移除缓存/publicstaticobjecttryremovecache(stringkey)if(httpruntime.cachekey!=null)returnhttpruntime.cache.remove(key);elsereturnnull;/移除键中带某关键字的缓存/publicstaticvoidremovemulticache(stringkeyinclude)idictionaryenumeratorcacheenum=httpruntime.cache.getenumerator();while(cacheenum.movenext()if(cacheenum.key.tostring().indexof(keyinclude.tostring()=0)httpruntime.cache.remove(cacheenum.key.tostring();/移除所有缓存/publicstaticvoidremoveallcache()idictionaryenumeratorcacheenum=httpruntime.cache.getenumerator();while(cacheenum.movenext()httpruntime.cache.remove(cacheenum.key.tostring(); 来看看我们的viewrolegrouprepository怎么写。新建类:viewrolegrouprepository代码 publicclassviewrolegrouprepository:repository/获取权限视图缓存列表,key:viewgrouplist/publiclistgetcacheall()listviewrolegroup;stringkey=viewgrouplist;if(httpruntime.cachekey!=null)viewrolegroup=(list)httpruntime.cachekey;elseviewrolegroup=findall().tolist();caches.tryaddcache(key,viewrolegroup,null,cache.noabsoluteexpiration,timespan.fromminutes(20),system.web.caching.cacheitempriority.normal,null);returnviewrolegroup;接下来我们将自定义自己的authorizeattribute,新建类centerauthorizeattribute代码 publicclasscenterauthorizeattribute:authorizeattributepublicoverridevoidonauthorization(authorizationcontextfiltercontext)stringaction=(string)filtercontext.routedata.valuesaction;stringcontroller=(string)filtercontext.routedata.valuescontroller;stringfullname=filtercontext.httpcontext.user.identity.name;if(!filtercontext.httpcontext.user.identity.isauthenticated)filtercontext.httpcontext.response.redirect(string.format(/account/logon?returnurl=0,filtercontext.httpcontext.request.url.pathandquery);elseif(newlogin().islock(fullname)thrownewexception(string.format(【用户:0】对不起,该用户已被锁定。,fullname);varr=newbll.rolegrouprepository().getuserrolegroup(fullname);varq=newbll.viewrolegrouprepository().getcacheall().findall(c=c.roleid=r.roleid&c.sysappcontroller=controller&c.sysappaction=action&(c.starttime.equals(anytime,stringcomparison.currentcultureignorecase)?true:(datetime.parse(c.starttime)=datetime.now);if(q.count=0)thrownewexception(string.format(【用户:0】对不起,您没有访问该页面的权限。,fullname);请注意varr=newbll.rolegrouprepository().getuserrolegroup(fullname);这个是我项目中通过用户名获得用户权限分组的实现,大家参考自己项目修改。大功告成,那怎么用呢,很简单。创建了需要的权限组,例如超级管理员 然后把对应的controller和action权限加入到组后,在需要的action上进行标注,例如centerauthorizepublicactionresultindex()viewdatamessage=welcometoasp.netmvc!;returnview();是不是很简单就通过数据库控制到每个需要权限控制的action咯?当然很多朋友可能还很迷糊,第一次写这类文章。部分代码也没调试。因为从项目剥离出来,所以大家见谅。ui部分和数据库的操作这里想滤过啦。这些比较简单的东西,大家应该很容易就能实现咯。a mvc权限设计思考 (三)后台ui设计 一些朋友提出让我加上细节部分,也有朋友pm说很多地方看不懂不知道该怎么用,由于目前正在赶学校的课程中心,暂没有时间来详细介绍使用,这里我把后台的一些设计截图出来,大家参考设计另外在第二篇提到的centerauthorizeattribute部分,已经做部分修改,原来的会出现逻辑判断的bug。权限大类管理 sysappcate可以看出,权限大类其实对应的是上部的大类菜单,当添加新的大类,该菜单将加载相应的项并呈现出来。权限列表管理 sysapplist这个界面对应系统所有的权限,有朋友提出如果出现相同的action,那么将无法分类管理,其实我认为不然,相同的action一般用到的设计无非是post和get的请求变更,那么如果一个页面只可以访问却无法操作,这样还有必要呈现给用户么?大家请注意观察,在这里的设置中如果为是否现实为:false,那么该权限将不会按照分组呈现在左侧的管理菜单中。权限组管理rolegroup这个表建立我们需要的系统权限组,这样更方便我们的管理。按照我的项目经验,一个项目很少会出现上百个权限组的要求,在课程中心这个项目中,当然也不会涉及到那么多的权限分类。这里为每一个权限多了一个“设置”的选项,下面来看看“设置”是怎么完成的.这里我做了一个tab,按照权限的大类分别放置所属的权限并进行加载。开始时间和结束时间是控制该权限在权限组中可以操作的时间,那么设置为anytime,也就表示开始或者结束为无限期。我在该项目中间会用到申报等一些流程,那么我们必须控制时间来按照需要进行申报。这里我们还要考虑,应该是当权限发生的更改,才提交这个数据,否则每次都提交这么多权限进行更新,效率上讲我们犯了一个低级的错误。上图的逻辑最终将更新至rolegroupapplist表中。好了,现在权限整体的结构都已经设计好,接下来将看看怎么把权限应用在对应用户上,这个很简单,但是还是比较说明一下我们现在只需要把对应的权限组分配给用户,就可以获得该组分配的权限。大家还可以看到我最上面的几个截图中有“帮助” ,这并不是一个固定的页面,我通过这样的形式来创建连接,那么可以把它放在masterpage里,不同的页面中连接其实会变成对应的controller和action,这样建立对应的表,可以很简单的对应这个view视图来加载帮助信息。最近手头的工作实在太忙,由于时间比较紧,就不一一介绍了。其实mvc给我们更大的灵活度和对视图的控制。我从mvc1 rc版就开始使用mvc做一些小项目,很早抛弃了我认为相对臃肿的webform,有朋友也曾质疑mvc的编程模式接近asp,其实这无疑是对于mvc整个框架及应用不了解所造成的。asp.net mvc2中扩展modelmetadata的descriptionattribute。 在mvc2中默认并没有实现descriptionattribute(虽然可以找到这个属性,通过阅读mvc源码,发现并没有实现方法),这很不方便,特别是我们使用editorformodel的时候,我们需要对字段进行简要的介绍,下面来扩展这个属性。新建类 descriptionmetadataprovider然后重写dataannotationsmodelmetadataprovider的createmetadata方法:publicclassdescriptionmetadataprovider:dataannotationsmodelmetadataproviderprotectedoverridemodelmetadatacreatemetadata(ienumerableattributes,typecontainertype,funcmodelaccessor,typemodeltype,stringpropertyname)listattributelist=newlist(attributes);dataannotationsmodelmetadataresult=(dataannotationsmodelmetadata)base.createmetadata(attributes,containertype,modelaccessor,modeltype,propertyname);descriptionattributedescriptionattribute=attributelist.oftype().firstordefault();if(de
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年黑河逊克县乡村医生公开招聘19人模拟试卷及答案详解(考点梳理)
- 2025年甘肃省卫生健康委系统招聘工作人员网上缴费考前自测高频考点模拟试题及答案详解(网校专用)
- 2025民办幼儿园劳动合同书
- 补偿协议书后悔
- 公司战略合作框架协议书
- 2025年公务员(国考)考试彩蛋押题【含答案详解】
- 体检护理题库及答案解析
- 个案服务协议书模板
- 多份管辖协议书
- 证券从业资格考试英文名及答案解析
- 中国密闭空间检测无人机行业市场前景预测及投资价值评估分析报告
- 2025面向机器学习的数据标注规范
- YY/T 0339-2024呼吸道用吸引导管
- 围手术期高血压专家管理共识
- 外科患者疼痛护理与管理
- 租金延迟缴纳申请书
- 学校体育学(唐炎-刘昕版)重点、知识点
- DL-T 2563-2022 分布式能源自动发电控制与自动电压控制系统测试技术规范
- 食堂工作人员培训内容
- 泛影葡胺在消化道造影中的应用
- 2022年11月四川省凉山州中级人民法院逐级遴选4名法官笔试题库含答案解析
评论
0/150
提交评论