源代码位置:\Web\Mvc\Processors:PermissionChecker.cs
wojilu.Web.Mvc.CoreHandler.ProcessRequest - >
wojilu.Web.Mvc.CoreHandler.ProcessRequest: ProcessContext.Begin ->
RouteProcess InitContextProcess
ActionMethodChecker
ForbiddenActionChecker
LoginActionChecker
HttpMethodChecker
PermissionChecker
最后一个checker的位置在生成页面之前,这个checker也是对于做成页面的Layout使用许可的预检查。
1 public override void Process( ProcessContext context ) { 2 3 MvcEventPublisher.Instance.BeginCheckPermission( context.ctx ); 4 if (context.ctx.utils.isSkipCurrentProcessor()) return ; 5 6 MvcContext ctx = context.ctx; 7 8 IList paths = ctx.utils.getLayoutPath(); 9 for ( int i = paths.Count - 1 ; i >= 0 ; i -- ) { 10 11 ControllerBase controller = ControllerFactory.FindSecurityController( paths[i].ToString(), ctx ); 12 if (controller == null ) continue ; 13 14 if (ctx.controller.utils.isCheckPermission( controller.GetType() )) { 15 controller.CheckPermission(); 16 } 17 18 if (ctx.utils.isEnd()) { 19 String msg = controller.utils.getActionResult(); 20 context.endMsg( checkFrame( ctx, msg ) ); 21 return ; 22 } 23 } 24 25 context.getController().CheckPermission(); 26 if (ctx.utils.isEnd()) { 27 context.endMsg( checkFrame( ctx, context.getController().utils.getActionResult() ) ); 28 return ; 29 } 30 31 } ctx.utils.getLayoutPath:
1 /// <summary> 2 /// 获取所有的布局文件的路径 3 /// </summary> 4 /// <returns></returns> 5 public IList getLayoutPath() { 6 if (_layoutPath == null ) _layoutPath = PathHelper.GetPathList( ctx.route.getRootNamespace(), ctx.controller.GetType().Namespace ); 7 return _layoutPath; 8 } 任何一个页面可以看做小的画面元素的组合,小的画面元素可以看做更小的画面元素的组合。wojilu将这样一个个基本元素称之为Layout。页面就是一个个Layout的嵌套组合。这些Layout的访问权限就在这里检查。可能大部分说,这样的检查是多余的,但是,在日益猖獗的黑客行为上,严格的安全是第一位的。
这篇,其实可以说的东西不多,毕竟只是一个小的Processor。
下面来总结一下wojilu的特点
1.所有的processor在执行前,都做了广播操作,以便系统的其他部分可以得到通知,做一些过滤。
2.所有的Processor都可以跳过。
3.所有的页面请求都统一放在Context容器里面。
4.我记录的安全检查,很多是基于方法特性批注的,这个和MS的MVC有点像。
下一篇开始讲述wojilu的页面引擎。
我记录1.7版,在长达5个月的开发和测试后,将在6月底推出(不过,介于以前跳票的经验,可能这次还要跳票,作者是个注重品质的老实人),敬请期待。