使用MvcHandler设计自定义系统权限<下>
2010-12-22 20:53
295 查看
本文是续上篇 使用MvcHandler设计自定义系统权限<上> 的下篇。通过本篇,我将在MVC2.0中提出一个系统权限的解决方案,如存在不足的地方,希望您能够指出。谢谢!一、回顾上篇中的内容:重点回顾一下上篇的3.2中的MyHandler类,该类继承MVC2.0的MvcHandler类。代码如下:
二、切入正题,将权限功能注入系统[/b] 先看以下代码:protected override System.IAsyncResult BeginProcessRequest(System.Web.HttpContext httpContext, System.AsyncCallback callback, object state) { //使用系统System.Security.Principal保存登录后的用户名 //示例代码此处userName赋值不够严谨,请注意对象空引用 string userName = httpContext.User.Identity.Name; if (string.Compare(userName, "admin", true) == 0) { //当条件满足时可以跳转到一个自定义的httphandler,比如(Error.aspx)等。 httpContext.Response.Redirect("http://www.cnblogs.com/ryanding"); return null; } return base.BeginProcessRequest(httpContext, callback, state); }这里我们还是使用.NET经典的System.Security.Principal类库。[code]从httpContext.User.Identity 获取到登录的用户名符串(从Name属性获取值)。在Login这个View内保存登录成功的用户信息,Login View 这个登录页面不需要对权限进行处理,everyone 都可以打开。后台代码如下:假设admin就是当前用户,这里的admin硬编码了,应该从UI获取。[code] 三、具体的实现思路
在MVC2.0中如果通过Action进行判断的话,难免要考虑到Area机制。因为在不同的Area中,可能会出现相同的Controller和Action。所以在权限判断时还需要将Area加入到逻辑中一起判断。这样就可以精确的控制所有的MVC的URL。比如我们通过 AreaName + ControllerName + ActionName 这样判断就可以对系统具体的URL进行唯一标识,同时也方便处理权限了。我们将BeginProcessRequest方法重新改造如下:protected override System.IAsyncResult BeginProcessRequest(System.Web.HttpContext httpContext, System.AsyncCallback callback, object state){//使用系统System.Security.Principal保存登录后的用户名//示例代码此处userName赋值不够严谨,请注意对象空引用string userName = httpContext.User.Identity.Name;//"admin"string strAreaName = base.RequestContext.RouteData.DataTokens["area"] == null ?"" : base.RequestContext.RouteData.DataTokens["area"].ToString();//"TestMvc.Areas.admin.Controllers"string strNameSpaces = base.RequestContext.RouteData.DataTokens["namespaces"] == null ?"" : base.RequestContext.RouteData.DataTokens["namespaces"].ToString();//"index"string strAction = base.RequestContext.RouteData.Values["action"].ToString();//"home1"string strController = base.RequestContext.RouteData.Values["controller"].ToString();//TODO:将area + action + controller 参与到权限判断中来if (string.Compare(userName, "admin", true) == 0){//当条件满足时可以跳转到一个自定义的httphandler,比如(Error.aspx)等。httpContext.Response.Redirect("http://www.cnblogs.com/ryanding");return null;}return base.BeginProcessRequest(httpContext, callback, state);}[/code]从MVC RouteData 的 DataTokens得到area相关信息;Values得到action与controller相关信息,最后将获取的值再参与具体的权限判断。
四、注意事项
在整个调试的过程中,发现只有一个地方让我调试了半天:MyHandler不能控制area的内部的Action。后来查阅相关资料,原来是在AreaRegistration(MVC2.0新增Area后自动生成的类)中设置问题。贴出代码,供参考:public override void RegisterArea(AreaRegistrationContext context){context.Routes.Add(new Route("{area}/{controller}/{action}/{id}", new RouteValueDictionary(new { area = "admin", controller = "Home1", action = "Index", id = "" }), new RouteValueDictionary(new { area = "admin" }), new RouteValueDictionary(new {area = "admin", Namespaces = "TestMvc.Areas.admin.Controllers" }), new HelloWorldHandler()));}[/code]新增的area结构如下:至此,您可以在MVC2.0中加入权限机制了。我相信通过这种方式注入自定义的权限结构到MVC程序中,总比用HttpModule来的强一些,因为客户端请求CSS/JS时,不需要再过滤这类的URL。代码看起会更舒服点,判断也就更简单点。希望本篇文章可以给您带来帮助,如有不足之处欢迎指出,谢谢!
相关文章推荐
- 使用MvcHandler设计自定义系统权限<上>
- 爱上MVC3系列~使用Func<string, HelperResult>实现访问权限的设计
- 设计完整的权限管理系统<非原创>
- 简洁经常使用权限系统的设计与实现(一):构造权限菜单树的N(N>=4)种方法
- 模块管理常规功能自定义系统的设计与实现(33--权限设计[3])
- 面向对象系统设计与开发专题<3>__开发过程
- 使用<<jquery+html5+css>>实现的20个酷的视觉大背景网站设计
- Android UI设计之<十>自定义ListView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果
- Spring Cloud版——电影售票系统<五>Hystrix使用消息中间件RabbitMQ收集数据
- 面向对象系统设计与分析专题<4>__业务事件分析
- 面向对象系统分析与设计专题<6>__类图
- SSH 常见权限设计四:如何得到<s:a action="url">kkk</s:a>里面的url
- 《Effective C#》读书笔记——条目22:通过定义并实现接口替代继承<使用C#表达设计>
- UITableView使用<1>之自定义UITableViewCell
- 记录我开发鞋服行业供应链软件的历程<设计系统技术架构>
- .NET 插件系统框架设计(二) 使用对象序列化实现自定义配置文件管理
- 简洁常用权限系统的设计与实现(一):构造权限菜单树的N(N>=4)种方法
- 高性能分布式计算与存储系统设计概要——暨2012年工作3年半总结(上) <转>
- [转载]使用Express3.0实现<Node.js开发指南>中的微博系统
- C++ 64位自定义随机数生成器的使用 <random> 参照C++11